详解ListView中多种item的实现方式
程序员文章站
2024-02-24 14:13:52
大家都知道在实际开发时,对listview的使用比较频繁,其表现也非常复杂。本文将通过实例介绍listview中多种item的实现方式,下面来一起看看吧。
使用listv...
大家都知道在实际开发时,对listview的使用比较频繁,其表现也非常复杂。本文将通过实例介绍listview中多种item的实现方式,下面来一起看看吧。
使用listview一般步骤:
- 设置显示的listview,设置显示的每一项item的view布局文件
- 设置每个item显示的数据
- 将数据显示的view中,继承baseadapter,重写
getcount()
,getitemid()
,getitem()
,getview()
这个四个方法;
如果实现listview的多种类型item的显示,那么就要再重写两个方法
-
getviewtypecount()
:得到总共item的显示的种类数, -
getitemviewtype()
:得到每个item显示的类型;为整型数据;
实现的效果如下:
一、准备填充的数据模型
1、解析json数据源
json数据放在res下的raw文件夹下:
[ { "letter": "a", "cities": [ "安庆", "安徽", "安全" ] }, { "letter": "b", "cities": [ "包头", "宝钢", "渤海", "本溪", "蚌埠" ] }, { "letter": "c", "cities": [ "长春", "长城", "长沙", "常州", "郴州", "重庆" ] }, { "letter": "d", "cities": [ "东莞", "东山", "大连", "大庆" ] } ]
2、建立数据对象
可以看到这个listview有两种类型,一个是显示字母,一个是显示内容,所以数据模型的建立如下,使用int型的type对数据类型进行标识;标识的值必须从0开始计数,有两种类型,那么就取0,1这两个值;
public class stringbean { string letter; string city; int type; public string getletter() { return letter; } public void setletter(string letter) { this.letter = letter; } public string getcity() { return city; } public void setcity(string city) { this.city = city; } public int gettype() { return type; } public void settype(int type) { this.type = type; } @override public string tostring() { return "stringbean{" + "letter='" + letter + '\'' + ", city='" + city + '\'' + ", type=" + type + '}'; } }
解析json数据填充成集合数据源这里就不提供了
二、准备两种item类型的布局文件
1、显示字母的type_layout.xml的布局文件
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <textview android:id="@+id/tvtype" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#999" android:text="a" android:textsize="20sp" /> </linearlayout>
2、显示城市city_layout.xml的布局文件
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <textview android:id="@+id/tvcity" android:layout_width="match_parent" android:layout_height="wrap_content" android:textsize="20sp" /> </linearlayout>
三、设置显示listview的数据和布局的适配器
这里的listview的item有两种类型,所以getviewtypecount()
返回2;
在getitemviewtype()
返回的是每次绘制每一个item的view显示的是何种类型,在数据模型stringbean有设置;
关于类型的整型设置,可能有很多人认为只要是任意的整型数字就可以了,其实不是这样
item类型标识值必须从0开始计数,如果item有两种类型,那么类型标识值就是0,1
如果是不从0开始标识,那么会报arrayindexoutofboundsexception数组下标越界的异常
public class listadapter extends baseadapter { arraylist<stringbean>list; context context; layoutinflater inflater; listadapter(arraylist<stringbean>list,context context){ this.list=list; this.context=context; inflater= (layoutinflater) context.getsystemservice(context.layout_inflater_service); } @override public int getcount() { return list.size(); } @override public object getitem(int i) { return list.get(i); } @override public long getitemid(int i) { return i; } @override public view getview(int position, view converview, viewgroup viewgroup) { view view=converview; stringbean bean=list.get(position); int type=bean.gettype(); if(type==0){ if(view==null){ view=inflater.inflate(r.layout.type_layout,viewgroup,false); } textview type_text= (textview) view.findviewbyid(r.id.tvtype); type_text.settext(bean.getletter()); }else if (type==1){ if(converview==null){ view=inflater.inflate(r.layout.city_layout,viewgroup,false); } textview city_text= (textview) view.findviewbyid(r.id.tvcity); city_text.settext(bean.getcity()); } return view; } @override public int getitemviewtype(int i) { return list.get(i).gettype(); } @override public int getviewtypecount() { return 2; } }
四、设置listview
listview的布局文件,在这里就不给出了
public class mainactivity extends appcompatactivity { arraylist<stringbean> list; listview listview; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); initbean(); initview(); } public void initbean(){ userdao dao=new userdao(this); list=dao.getlist(); } public void initview(){ listview= (listview) findviewbyid(r.id.listview); listadapter adapter=new listadapter(list,this); listview.setadapter(adapter); } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。