Android中最常用的控件之ListView

一、前言:作为一个新手的我,也刚开始学List View遇到了很多问题,最主要的是有很多不懂的地方,尤其是在给List View中的自定义一些图片或者其他的控件的时候,就需要自定义一个类和适配器,可能是我对适配器和泛型的理解不到位吧,希望在以后的学习中能将对这两方面的知识空缺填补回来。另外图中有自定义的标题栏,但实际代码中是被我删除了的。

二、分析:首先做一个简短的分析,前面也说了我对这个控件的理解不是很到位,只能站在我理解的高度进行一点简短的分析。相对于其他简单控件来说,List View是一个比较特殊的控件,最基本的只在Item中添加一个标题的简单用法这里就不说了,主要说一下如何自定义在List View中添加标题以及说明还有图片等其他控件的用法,如下图所示:


要想弄成图中这种:

三、实现过程

1. 我首先写了一个China类,他的属性包括Item里的图片和标题(里面的地名)还有标题说明(地名下面的一段话)代码如下:

public class China {
    private String name;
    private String capital;
    private int image;
    public China(String name,String capital,int image){
        this.name = name;
        this.capital = capital;
        this.image = image;
    }
    public String getName(){
        return name;
    }
    public String getCapital(){
        return capital;
    }
    public int getIcon(){
        return image;
    }
}

2. 然后再写一个List View里面每一行(Item)的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    >
    <ImageView
        android:id="@+id/ItemImage"
        android:layout_alignParentLeft="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        />
    <TextView
        android:id="@+id/ItemTitle"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:textSize="20sp"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/ItemImage"
        />
    <TextView
        android:id="@+id/ItemText"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_below="@+id/ItemTitle"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/ItemImage"
        />
</RelativeLayout>

3、自定义一个适配器,将数据源传递到item中去:

public class ChinaAdapter extends ArrayAdapter<China>{
    private int resourceId;
    public ChinaAdapter(Context context, int textViewResourceId, List<China> objects){
        super(context,textViewResourceId,objects);
        resourceId = textViewResourceId;
    }
    @Override
    public View  getView(int position, View convertView, ViewGroup parent) {
        China china = getItem (position);
        View view;
        if(convertView==null){
            view = LayoutInflater.from ( getContext () ).inflate ( resourceId,parent,false );
        }else {
            view = convertView;
        }
        ImageView  chinaImage = view.findViewById ( R.id.ItemImage);
        TextView chinaTitle = view.findViewById ( R.id.ItemTitle );
        TextView chinaText = view.findViewById ( R.id.ItemText );
        chinaTitle.setText ( china.getName () );
        chinaText.setText ( china.getCapital () );
        chinaImage.setImageResource ( china.getIcon () );
        return  view;
    }
}

4.最后就是MainActivity:

public class MainActivity extends AppCompatActivity {

    private ListView mLv;
    private List<China>chinaList = new ArrayList<> (  );
    private String[]  data = { "北京","重庆","甘肃","上海", "浙江","江苏"};
    private String[]  dataText = {"北京:祖国的首都","重庆:从你的全世界路过","兰州:我想吃拉面",
            "上海:等我,我一定会去看看","杭州:可能会路过的","南京:不了解"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate ( savedInstanceState );
        setContentView ( R.layout.activity_main );
        //初始化China属性
        initChina ();
        ChinaAdapter adapter = new ChinaAdapter ( MainActivity.this,R.layout.item,chinaList );
        mLv = findViewById ( R.id.mLv );
        //将数据加载到ListView中
        mLv.setAdapter ( adapter );
        //下面是对ListView的点击事件
        mLv.setOnItemClickListener ( new AdapterView.OnItemClickListener () {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                China china = chinaList.get ( i );//i是判断是点了那个Item
                Toast.makeText ( MainActivity.this,china.getCapital (),Toast.LENGTH_SHORT ).show ();
            }
        } );
    }
    private  void  initChina(){
        for (int i = 0;i<2;i++) {
            China beijing = new China ( data[0], dataText[0], R.mipmap.bj );
            chinaList.add ( beijing );
            China chongqing = new China ( data[1], dataText[1], R.mipmap.cq );
            chinaList.add ( chongqing );
            China gansu = new China ( data[2], dataText[2], R.mipmap.gs );
            chinaList.add ( gansu );
            China shanghai = new China ( data[3], dataText[3], R.mipmap.sh );
            chinaList.add ( shanghai );
            China zhejiang = new China ( data[4], dataText[4], R.mipmap.zj );
            chinaList.add ( zhejiang );
            China jiangsu = new China ( data[5], dataText[5], R.mipmap.js );
            chinaList.add ( jiangsu );
        }
    }
}

后记:最简单的一次笔记,确实也没理解到位。等后面再继续完善吧。

原代码下载


猜你喜欢

转载自blog.csdn.net/sdbx_lyp/article/details/80072669
今日推荐