一、前言:作为一个新手的我,也刚开始学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 ); } } }
后记:最简单的一次笔记,确实也没理解到位。等后面再继续完善吧。