11月4日Android学习笔记

标签

Android

Button

View

GridView

ListView

adapter

发布时间:

本文字数:1,385 字 阅读完需:约 6 分钟

展示图片

使用AppCompatImageView标签展示图片,放置图片的控件
src: 设置显示在控件上的图片
app:srcCompat="" 可以放置显示图片(不会显示),设计时展示,运行时不展示

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="55dp"
    android:background="@color/purple_200">
<!--    放置图片的控件
        src: 设置显示在控件上的图片
        app:srcCompat="" 可以放置显示图片(不会显示),设计时展示,运行时不展示
-->
    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/title_iv_left"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:src="@mipmap/icon_back"/>

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/title_iv_right"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginRight="10dp"
        android:layout_alignParentRight="true"
        android:src="@mipmap/icon_setting"/>
    <TextView
        android:id="@+id/title_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="18sp"
        android:textStyle="bold"
        android:text="日常用品"/>
</RelativeLayout>

引用布局

使用include引用其他布局,示例

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <!-- 引用其他布局 -->
    <include
        android:id="@+id/main_title"
        layout="@layout/title_layout"/>

</LinearLayout>

单选按钮

RadioGroup 单选按钮组
RadioButton 单选按钮

布局示例

    <RadioGroup
        android:id="@+id/rg"
        android:layout_width="match_parent"
        android:layout_below="@+id/tv"
        android:layout_margin="10dp"
        android:layout_height="wrap_content">

        <RadioButton
            android:id="@+id/rb_man"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="男"
            android:checked="true"/>
        <RadioButton
            android:id="@+id/rb_woman"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="女"/>
        <RadioButton
            android:id="@+id/rb_qt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="其他"/>

    </RadioGroup>

单选按钮点击事件监听

    //单选按钮监听器
    RadioGroup.OnCheckedChangeListener changeListener = new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, int id) {
            //如果一个页面当中有多个单选按钮,可以判断一下哪个组被触发了
            if(radioGroup.getId() == R.id.rg){
                //选中的单选按钮的id
                switch (id){
                    case R.id.rb_man:
                        showToast("您选择了男性");
                        break;
                    case R.id.rb_woman:
                        showToast("您选择了女性");
                        break;
                    case R.id.rb_qt:
                        showToast("您选择了其他");
                        break;
                }
            }
        }
    };

activity跳转

结束当前avtivity: finish()

activity跳转是压栈过程,打开新的活动,相当于往栈中push一个新的活动对象。结束活动,相当于pop出栈

视图

ListView, 使用适配器ArrayAdapter进行绑定设置。示例

activity_shop_type.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".ShopTypeActivity">
    <include layout="@layout/title_layout"
        android:id="@+id/st_title"></include>
    <!--    下拉列表视图-->
    <Spinner
        android:id="@+id/st_sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/bg_sp"
        android:dropDownWidth="match_parent"
        android:spinnerMode="dropdown"
        android:overlapAnchor="false"
        android:layout_margin="10dp"/>
<!--    列表视图-->
    <ListView
        android:id="@+id/st_lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@color/teal_200"
        android:dividerHeight="1dp"
        android:visibility="gone"/>
    <GridView
        android:id="@+id/st_gv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="3"/>

</LinearLayout>

ShopTypeActivity.java

package com.xyl.app1104;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ListView;
import android.widget.Spinner;

import java.util.ArrayList;
import java.util.List;

public class ShopTypeActivity extends AppCompatActivity {
    ListView typeLv;
    GridView typeGv;
    List<String> mDatas; //数据源
    Spinner typeSp;
    String[] spArr = {"列表视图", "网格视图"};
    private ArrayAdapter<String> stringArrayAdapter;
    private ArrayAdapter<String> stringArrayAdapter1;
    private ArrayAdapter<String> stringArrayAdapter2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shop_type);
        initView();
        //获取数据源
        initDatas();
        //设置适配器 ArrayAdapter:当列表或者网格当中的每一项只有一个文本框,可以使用这个适配器
        //参数2:每一项的item的布局 参数3:显示数据的文本 参数4:数据
        stringArrayAdapter = new ArrayAdapter<>(
                this, R.layout.item_st, R.id.item_st_tv, mDatas);
        typeLv.setAdapter(stringArrayAdapter);
        //给gridview设置adapter
        stringArrayAdapter1 = new ArrayAdapter<>(this, R.layout.item_st_gv,
                R.id.item_gtv, mDatas);
        typeGv.setAdapter(stringArrayAdapter1);
        //给Spinner设置adapter
        stringArrayAdapter2 = new ArrayAdapter<>(this, R.layout.item_st_sp, R.id.item_st_tv, spArr);
        typeSp.setAdapter(stringArrayAdapter2);
    }

    /**
     * 对于ListView的数据源进行初始化
     */
    private void initDatas() {
        mDatas = new ArrayList<>();
        mDatas.add("调料干货");
        mDatas.add("零食");
        mDatas.add("饮料");
        mDatas.add("厨房用品");
        mDatas.add("日用品");
        mDatas.add("烟酒");
        for(int i = 1; i < 20; i++){
            mDatas.add("第" + i + "条数据");
        }
    }

    private void initView() {
        typeLv = findViewById(R.id.st_lv);
        typeGv = findViewById(R.id.st_gv);
        typeSp = findViewById(R.id.st_sp);
    }
}

    /**
     * 对于ListView的数据源进行初始化
     */
    private void initDatas() {
        mDatas = new ArrayList<>();
        mDatas.add("调料干货");
        mDatas.add("零食");
        mDatas.add("饮料");
        mDatas.add("厨房用品");
        mDatas.add("日用品");
        mDatas.add("烟酒");
        for(int i = 1; i < 20; i++){
            mDatas.add("第" + i + "条数据");
        }
    }

    private void initView() {
        typeLv = findViewById(R.id.st_lv);
        typeGv = findViewById(R.id.st_gv);
    }
}

列表视图

item_st.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:padding="20dp"
    android:layout_height="match_parent">
<!--    listView中每一条的布局-->
    <TextView
        android:id="@+id/item_st_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textStyle="bold"
        android:text="酒水饮料"/>
    <ImageView
        android:id="@+id/item_st_iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:src="@mipmap/icon_enter"/>


</RelativeLayout>

网格视图

gridView

item_st_gv.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:background="@drawable/bg_gitem"
    android:layout_margin="5dp">
    <TextView
        android:id="@+id/item_gtv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textStyle="bold"
        android:textSize="20sp"
        android:text="111"/>

</RelativeLayout>

drawable/bg_gitem.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="20dp"/>
    <stroke android:width="3dp" android:color="@color/teal_700"/>
    <solid android:color="@color/pink2"/>

</shape>

下拉列表视图

Spinner

设置下拉列表不遮挡下拉框可以使用

android:overlapAnchor="false" 这条属性代码提示没有

layout/item_st_sp.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:padding="5dp"
    android:layout_height="match_parent">
<!--    listView中每一条的布局-->
    <TextView
        android:id="@+id/item_st_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textStyle="bold"
        android:text="酒水饮料"/>



</RelativeLayout>

自定义适配器

示例

package com.xyl.app1104;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

/**
 * ListView的适配器
 * 因为每一个item的布局不只有一个TextView,所以要自己写适配器
 * 1. 继承于BaseAdapter
 * 2. 重写4个方法,不需要自己调用,
 */
public class MyAdapter extends BaseAdapter {
    //显示的数据源
    private List<ItemBean> mDatas;
    private Context context;

    public MyAdapter(Context context, List<ItemBean> mDatas) {
        this.mDatas = mDatas;
        this.context = context;
    }

    /**
     * 返回列表的长度
     * @return
     */
    @Override
    public int getCount() {
        return mDatas.size();
    }

    /**
     * 返回列表指定位置对应的数据
     * @param pos
     * @return
     */
    @Override
    public Object getItem(int pos) {
        return mDatas.get(pos);
    }

    /**
     * 返回指定位置的itemView的id
     * @param pos
     * @return
     */
    @Override
    public long getItemId(int pos) {
        return pos;
    }

    /**
     * 返回指定位置的View对象,将布局转换成view对象,view中显示的内容都在这里设置
     * convertView:在ListView当中可以被复用的itemView
     * itembean是对象,在集合当中,如果集合有1000条就有1000个itembean的对象
     * 将itembean对象的内容设置到view上,然后让view再放入listview中
     * 如果有1000个itemview对象放到1000个view上就会资源浪费。因为用户在一个屏幕当中
     * 只有几条,当滑动屏幕时,上面的view内容就没用了。无用的view的格式和后面一样。
     * 所以后面就不需要再生成view对象了,就可以直接使用了。
     * @param pos
     * @param convertView
     * @param parent
     * @return
     */
    @Override
    public View getView(int pos, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            //将布局转换成view对象 LayoutInflater:布局加载器
            convertView = LayoutInflater.from(context)
                    .inflate(R.layout.item_text, parent, false);
            //进行控件属性的设置
            holder = new ViewHolder(convertView);
            //将holder对象绑定在view上
            convertView.setTag(holder);
        }
        else{
            //属性已经都找到了,不用重新设置
            holder = (ViewHolder) convertView.getTag();
        }
        ItemBean bean = mDatas.get(pos);
        holder.tv1.setText(bean.getTitle());
        holder.tv2.setText(bean.getMsg());
        holder.iv.setImageResource(bean.getResId());

        return convertView;
    }

    /**
     * 将每一个itemview对象当中包含所有需要改变的view放到同一个部分进行保管
     */
    class ViewHolder{
        TextView tv1, tv2;
        ImageView iv;
        public ViewHolder(View itemView){
            tv1 = itemView.findViewById(R.id.item_tv1);
            tv2 = itemView.findViewById(R.id.item_tv2);
            iv = itemView.findViewById(R.id.item_iv);
        }

    }
}
/**
 * ListView的优化
 * 1. 设置高度固定,避免重复测量显示的高度
 * 2. getView的优化
 *      对于convertView进行判断,如果有创建好的,闲置的view模板,可以直接使用,否则就创建
 *      对于findViewById进行优化,对于可复用的view,不需要重复查找控件id,对于新生成的,查找控件id
 */