详解ListView中多种item的实现方式

大家都知道在实际开发时,对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); } }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

时间: 2024-09-19 09:18:54

详解ListView中多种item的实现方式的相关文章

详解虚拟机中的NAT网络连接方式

  我就个人对虚拟机的理解,把虚拟机上网最方便的也是最难理解的NAT方式和大家一起聊聊,因为是大话NAT,所以说的会罗嗦点,不过主要是照顾新人.:) 老鸟就赶快飞吧 呵呵 先说一点别的,做为引子 假设现在R老师带3个班的学生,分别为a班. b班. c班 .现在就出现了两个交流方式: 第1种交流方式: 本班内交流,比如说a班的一个同学想和另一个同学交流,就可以直接在班里喊那个同学的名字.这个就向计算机内的同一个网段的计算机的交流方式-广播. 第2种交流方式: 班与班之间的学生交流,这个时候在a班里

举例详解AngularJS中ngShow和ngHide的使用方法

这篇文章主要介绍了举例详解AngularJS中ngShow和ngHide的使用方法,AngularJS是一款非常热门的JavaScript框架,需要的朋友可以参考下 今天我们来看看怎样使用Angular的ngShow 和ngHide 指令来完成它们听起来应该完成的,显示和隐藏! 它们应该做的事 ngShow 和ngHide 允许我们显示或隐藏不同的元素.这有助于创建Angular应用时因为我们的单页程序会有许多的移动部件随着应用状态的改变而来来去去. 这些指令的最伟大的部分就是我们不必使用CSS

详解Ruby中范围的概念

  这篇文章主要介绍了详解Ruby中范围的概念,需要的朋友可以参考下 范围无处不在:1月至12月,0至9日,50至67行,依此类推. Ruby支持范围,并允许我们使用多种方式的范围: 作为序列范围 作为条件范围 作为区间范围 作为序列范围: 首先,也许是最自然的使用范围来表达序列.序列有一个起点,一个终点和序列中的连续值的方法来生产. Ruby创建'' ..''和'' ...''范围内运算符使用这些序列.这两个点的形式建立一个包容性的范围,而三个点的形式创建了一个范围,不包括指定的高值. ? 1

详解Java中的正则表达式

详解Java中的正则表达式,并列出常用的正则表达式语法和一些常用的场景. 判断一个字符串是否是由数字组成: 当不使用正则表达式的时候的实现代码: public class RegexDemo01 { public static void main(String[] args) { String s = "23432324"; char c[] = s.toCharArray();//将字符串转换成字符数组 for (int i = 0; i < c.length; i++) {

详解Python中的type()方法的使用

  这篇文章主要介绍了详解Python中的type()方法的使用,是Python入门中的基础知识,需要的朋友可以参考下 type()方法返回传递变量的类型.如果传递变量是字典那么它将返回一个字典类型. 语法 以下是type()方法的语法: ? 1 type(dict) 参数 dict -- 这是字典 返回值 此方法返回传递变量的类型. 例子 下面的例子显示type()方法的使用 ? 1 2 3 4 #!/usr/bin/python   dict = {'Name': 'Zara', 'Age'

详解Python中的序列化与反序列化的使用

  这篇文章主要介绍了详解Python中的序列化与反序列化的使用,针对pickle和cPickle对象进行了探究,需要的朋友可以参考下 学习过marshal模块用于序列化和反序列化,但marshal的功能比较薄弱,只支持部分内置数据类型的序列化/反序列化,对于用户自定义的类型就无能为力,同时marshal不支持自引用(递归引用)的对象的序列化.所以直接使用marshal来序列化/反序列化可能不是很方便.还好,python标准库提供了功能更加强大且更加安全的pickle和cPickle模块. cP

详解JavaScript中的客户端消息框架设计原理

  这篇文章主要介绍了详解JavaScript中的客户端消息框架设计原理,包括客户端和服务器端的通信等方面的内容,需要的朋友可以参考下 哇--是个危险的题目,对吗?我们对于什么是本质的理解当然会随着我们对要解决问题的理解而变化.因此我不会说谎--一年前我所理解的本质很不幸并不完整,因为我确信我将要写的已经快伴随我有6个月之久.所以,这篇文章是我在发现JavaScript中成功的运用客户端消息模式的一些关键要点时的一个掠影. 1.) 理解中介者与观察者的区别 大多数人在描述任何事件/消息机制的时候

举例详解Python中smtplib模块处理电子邮件的使用

  这篇文章主要介绍了举例详解Python中smtplib模块处理电子邮件的使用,是Python入门学习中的基础知识,需要的朋友可以参考下 在基于互联网的应用中,程序经常需要自动地发送电子邮件.如:一个网站的注册系统会在用户注册时发送一封邮件来确认注册;当用户忘记登陆密码的时候,通过邮件来取回密码.smtplib模块是python中smtp(简单邮件传输协议)的客户端实现.我们可以使用smtplib模块,轻松的发送电子邮件.下面的例子用了不到十行代码来发送电子邮件: ? 1 2 3 4 5 6

详解AngularJS中的依赖注入机制

  这篇文章主要介绍了详解AngularJS中的依赖注入机制,对JavaScript各组件的使用起到非常重要的作用,需要的朋友可以参考下 依赖注入是一个在组件中给出的替代了硬的组件内的编码它们的依赖关系的软件设计模式.这减轻一个组成部分,从定位的依赖,依赖配置.这有助于使组件可重用,维护和测试. AngularJS提供了一个至高无上的依赖注入机制.它提供了一个可注入彼此依赖下列核心组件. 值 工厂 服务 提供者 常值 值 值是简单的JavaScript对象,它是用来将值传递过程中的配置相位控制器