一、概述
一般而言,listview每个item的样式是一样的,但也有很多应用场景下不同位置的item需要不同的样式。
拿微信举例,前者的代表作是消息列表,而后者的典型则是聊天会话界面。
本文重点介绍后者,也就是多类型item的listview的实现思路和方法,比如实现一个这样的聊天会话页面:
二、实现思路
2.1 第一种思路:用“一种类型”变相实现多种类型
这种思路其实与 ListView之点击展开菜单 这篇文章的原理一样,每个item的布局都包含所有类型的元素:
对于每个item,根据实际类型,控制“日期”、“发出的消息”、“接收的消息”这三部分的显示/隐藏即可。
这种思路的优势在于好理解,是单一类型的listview的扩展,却并不适合本文描述的应用场景。
因为每个item实际上只会显示“日期”、“发出的消息”、“接收的消息”中的一种,所以每个item都inflate出来一个“全家桶”layout再隐藏其中的两个,实在是一种资源浪费。
2.2 第二种思路:利用Adapter原生支持的多类型
其实 android.widget.Adapter 类已经原生支持了多种类型item的模式,并提供了 int getViewTypeCount(); 和 int getItemViewType(int position); 两个方法。
只不过在 android.widget.BaseAdapter 中对这两个方法进行了如下的默认实现:
1 public int getViewTypeCount() { 2 return 1; 3 } 4 5 public int getItemViewType(int position) { 6 return 0; 7 }
那我们要做的就是根据实际的数据,对这两个方法进行正确的返回。
本文采用第二种思路实现多种类型item的listview。
[转载请保留本文地址:http://www.cnblogs.com/snser/p/5539749.html]
三、开始干活
3.1 首先准备好listview的数据和三种item布局
ListViewMultiTypeActivity$JsonListData:
1 private static class JsonListData { 2 public static class Message { 3 public static final int TYPE_COUNT = 3; 4 public static final int TYPE_DATE = 0x00; 5 public static final int TYPE_TXT_SENT = 0x01; 6 public static final int TYPE_TXT_RECV = 0x02; 7 public int type; 8 public String txt; 9 public long time; 10 } 11 public List<Message> messages = new ArrayList<Message>(); 12 }