这篇文章主要给大家介绍了关于列表视图中多种项目的实现方式,文中通过示例代码介绍的很详细,有需要的朋友们可以参考借鉴,下面来一起看看吧。
大家都知道在实际开发时,对列表视图的使用比较频繁,其表现也非常复杂。本文将通过实例介绍列表视图中多种项目的实现方式,下面来一起看看吧。
使用ListView一般步骤:
设置显示的列表视图,设置显示的每一项项目的视角布局文件
设置每个项目显示的数据
将数据显示的视角中,继承基本适配器,重写getCount()、getItemId()、getItem()、getView()这个四个方法;
如果实现ListView的多种类型item的显示,那么就要再重写两个方法
getViewTypeCount():得到总共项目的显示的种类数,
getItemViewType():得到每个项目显示的类型;为整型数据;
实现的效果如下:
一、准备填充的数据模型
1、解析json数据源
json数据放在表示留数下的生的文件夹下:
[
{
字母:' A ',
城市':[
'安庆,
'安徽,
'安全'
]
},
{
字母:' B ',
城市':[
'包头,
'宝钢,
'渤海,
'本溪,
'蚌埠'
]
},
{
字母:' C ',
城市':[
'长春,
'长城,
'长沙,
'常州,
'郴州,
'重庆'
]
},
{
字母:' D ',
城市':[
'东莞,
'东山,
'大连,
'大庆'
]
}
]
2、建立数据对象
可以看到这个列表视图有两种类型,一个是显示字母,一个是显示内容,所以数据模型的建立如下,使用(同国际组织)国际组织型的类型对数据类型进行标识;标识的值必须从0开始计数,有两种类型,那么就取0,1这两个值;
公共类StringBean {
字符串字母;
弦城;
(同Internationalorganizations)国际组织类型;
公共字符串getLetter() {
回函;
}
公共void setLetter(字符串){
这封信=信
}
公共字符串getCity() {
返回城市;
}
public void setCity(String city) {
这个城市=城市
}
public int getType() {
返回类型;
}
公共void setType(int类型){
this.type=type
}
@覆盖
公共字符串toString() {
返回" StringBean{ "
字母=' '字母' \ ' '
,city='' city '\ ' '
,type=' type
'}';
}
}
解析json数据填充成集合数据源这里就不提供了
二、准备两种项目类型的布局文件
1、显示字母的type_layout.xml的布局文件
?可扩展标记语言版本='1.0 '编码='utf-8 '?
线性布局xmlns:Android=' http://模式。安卓。' com/apk/RES/Android '
Android:layout _ width=' match _ parent '
Android:layout _ height=' match _ parent '
安卓:方向='垂直'
文本视图
android:id='@ id/tvType '
Android:layout _ width=' match _ parent '
Android:layout _ height=' wrap _ content '
android:background='#999 '
android:text='A '
android:textSize='20sp' /
/线性布局
2、显示城市city_layout.xml的布局文件
?可扩展标记语言版本='1.0 '编码='utf-8 '?
线性布局
xmlns:Android=' http://模式。安卓。' com/apk/RES/Android '
安卓:方向='垂直'
Android:layout _ width=' match _ parent '
Android:layout _ height=' match _ parent '
文本视图
android:id='@ id/tvCity '
Android:layout _ width=' match _ parent '
Android:layout _ height=' wrap _ content '
android:textSize='20sp '
/
/线性布局
三、设置显示ListView的数据和布局的适配器
这里的列表视图的项目有两种类型,所以getViewTypeCount()返回2;
在getItemViewType()返回的是每次绘制每一个项目的视角显示的是何种类型,在数据模型StringBean有设置;
关于类型的整型设置,可能有很多人认为只要是任意的整型数字就可以了,其实不是这样
项目类型标识值必须从0开始计数,如果项目有两种类型,那么类型标识值就是0,1
如果是不从0开始标识,那么会报ArrayIndexOutOfBoundsException数组下标越界的异常
公共类列表适配器扩展基本适配器{
ArrayListStringBeanlist
语境语境;
布局充气机;
列表适配器(ArrayListStringBeanlist,上下文上下文){
这个列表=列表
this.context=上下文
inflater=(LayoutInflater)上下文。getsystem服务(上下文.LAYOUT _ INFLATER _ SERVICE);
}
@覆盖
public int getCount() {
返回列表。size();
}
@覆盖
公共对象getItem(int i) {
返回列表。get(I);
}
@覆盖
public long getItemId(int i) {
返回我;
}
@覆盖
公共视图getView(int position,View converView,ViewGroup viewGroup) {
视图视图=视图视图
StringBean bean=list。get(位置);
int type=bean。gettype();
if(type==0){
if(view==null){
视图=充气机。膨胀(r .布局。type _ layout,viewGroup,false);
}
TextView type _ text=(TextView)视图。findviewbyid(r . id。电视类型);
类型_文本。settext(bean。getletter());
}else if (type==1){
if(converView==null){
视图=充气机。膨胀(r .布局。city _ layout,viewGroup,false);
}
TextView city _ text=(TextView)视图。findviewbyid(r . id。电视城);
city _ text。settext(bean。get city());
}
返回视图;
}
@覆盖
public int getItemViewType(int I){
返回list.get(i).getType();
}
@覆盖
public int getViewTypeCount() {
return 2;
}
}
四、设置ListView
列表视图的布局文件,在这里就不给出了
公共类主要活动扩展AppCompatActivity {
ArrayListStringBean列表;
列表视图列表视图;
@覆盖
受保护的void onCreate(Bundle saved instancestate){
超级棒。oncreate(savedInstanceState);
setContentView(r . layout。活动_主);
init bean();
init view();
}
public void initBean(){
UserDao Dao=new UserDao(this);
list=Dao。getlist();
}
public void initView(){
listView=(listView)findViewById(r . id。listView);
列表适配器adapter=新列表适配器(list,this);
listView.setAdapter(适配器);
}
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。