Android ListView添加多种类型的ItemView
一般复杂的ListView都会重写BaseAdapter,通过重用convertView来减少inflate,通过setTag()和ViewHolder改变ItemView的内容。
重写BaseAdapter必须要实现
public int getCount() public Object getItem(int position) public View getView(int position, View convertView, ViewGroup parent)
这三个函数。
补充一下ListView的ViewHolder机制:
在Android中inflate是比较耗费资源的,如果每次getView都执行inflate,那么很容易造成内存溢出,所以要在getView中重用convertView,如果convertView已经进行了inflate,那么只要对view进行赋值就可以,比如setText()。所以当convertView为空时才会执行inflate,当convertView不为空时,只执行赋值操作。通过给convertView设置一个tag来记录view的引用,还可以减少findViewById()的次数。
在默认情况下,Adapter只保存一个convertView,可以简单的认为,每次getView()时的convertView都是上次getView时return的view。这种情况显然是不能实现多种类型的ItemView的,如何才能在getView时让convertView是我们想要的布局类型呢,BaseAdapter还有两个可以重写的函数:
public int getItemViewType(int position) public int getViewTypeCount()
看到这两个函数应该很多人都明白了,getViewTypeCount()就是获取列表有几种布局类型,getItemViewType(int position)是获取在position位置上的布局类型。
通过一个小Demo来测试一下,写一个有3中布局的列表,3中布局分别是TextView,EditText,Button,
首先实现列表的ListItem
package com.example.testmultipletypelist;
public class ListItem {
public static final int TYPE_TEXT = 0;
public static final int TYPE_EDIT = 1;
public static final int TYPE_BUTTON = 2;
public static final int TYPE_COUNT = 3;
private String name;
private int type;
public ListItem(int type, String name) {
this.type = type;
this.name = name;
}
public int getType() {
return type;
}
public String getName() {
return name;
}
}
重写BaseAdapter中的getItemViewType()和getViewTypeCount()。
@Override
public int getItemViewType(int position) {
if (list != null && position < list.size()) {
return list.get(position).getType();
}
return super.getItemViewType(position);
}
@Override
public int getViewTypeCount() {
return ListItem.TYPE_COUNT;
}
然后在getView()中,可以通过getItemViewType()来处理不同的布局
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
switch (type) {
case ListItem.TYPE_TEXT: {
TextViewHolder holder = null;
if (convertView == null) {
convertView = activity.getLayoutInflater().inflate(R.layout.list_test_item, null);
holder = new TextViewHolder();
holder.textView = (TextView) convertView.findViewById(R.id.tv_text);
convertView.setTag(holder);
} else {
holder = (TextViewHolder) convertView.getTag();
}
holder.textView.setText(list.get(position).getName());
break;
}
case ListItem.TYPE_EDIT: {
EditViewHolder holder = null;
if (convertView == null) {
convertView = activity.getLayoutInflater().inflate(R.layout.list_edittext_item, null);
holder = new EditViewHolder();
holder.editText = (EditText) convertView.findViewById(R.id.ed_edittext);
convertView.setTag(holder);
} else {
holder = (EditViewHolder) convertView.getTag();
}
holder.editText.setText(list.get(position).getName());
break;
}
case ListItem.TYPE_BUTTON: {
ButtonViewHolder holder = null;
if (convertView == null) {
convertView = activity.getLayoutInflater().inflate(R.layout.list_button_item, null);
holder = new ButtonViewHolder();
holder.button = (Button) convertView.findViewById(R.id.btn_button);
convertView.setTag(holder);
} else {
holder = (ButtonViewHolder) convertView.getTag();
}
holder.button.setText(list.get(position).getName());
break;
}
default:
break;
}
return convertView;
}
运行效果

Android ListView添加多种类型的ItemView的更多相关文章
- Android开发之ListView添加多种布局效果演示
在这个案例中展示的新闻列表,使用到ListView控件,然后在适配器中添加多种布局效果,这里通过重写BaseAdapter类中的 getViewType()和getItemViewType()来做判断 ...
- Android进阶笔记11:ListView篇之ListView显示多种类型的条目(item)
ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似. 1. 这是MainActivity,MainActivity的布局就是一个ListView,太简单了这里就不写了,直接 ...
- Android进阶笔记10:ListView篇之ListView显示多种类型的条目(item)
ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似. 1. 这是MainActivity,MainActivity的布局就是一个ListView,太简单了这里就不写了,直接 ...
- ListView之多种类型Item
一.概述 一般而言,listview每个item的样式是一样的,但也有很多应用场景下不同位置的item需要不同的样式. 拿微信举例,前者的代表作是消息列表,而后者的典型则是聊天会话界面. 本文重点介绍 ...
- ListView显示多种类型的item
ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似 这是MainActivity:,MainActivity的布局就是一个ListView public class Mai ...
- Android ListView 显示多种数据类型
ListView往往可能会有不同的数据类型,单类型的数据可能运用会比较少些,这也是最近项目中的一个需求{在发送消息的时候,需要选择联系人,而联系人列表由英文字母索引+联系人组成},上一篇文章只是一个基 ...
- android listview 添加数据
<span style="white-space:pre"> </span>listView = (ListView) findViewById(R.id. ...
- Android ListView Adapter的getItemViewType和getViewTypeCount多种布局
<Android ListView Adapter的getItemViewType和getViewTypeCount多种布局> 在Android的ListView中.假设在一个Lis ...
- Android之listview添加数据篇
一.ListView: 1. ListView通常有两个职责: 1.向布局填充数据 2.处理选择点击等操作 2.ListView的创建需要3个元素: 1. ListView中的每一列的View. 2. ...
随机推荐
- Asp.net 高性能 Sqlite ORM 框架之 sqliteSugar
一.介简 easyliter框架的升级版本,并且正式命名为SqliteSugar框架,另外Sugar系列还有 MySql和MsSql版本,Oracle版本待开发中(因为客户端太大一直在忧郁当中) 用S ...
- MVC中Json的使用:Controller中Json的处理
一.当查询得到的数据符合前台要求,不需要做任何处理,直接DataList To Json 返回前台. 代码: , out recordCount); return Json(allEntities, ...
- CSS 圆角
CSS代码: -moz-border-radius: 15px; /* Gecko browsers */ -webkit-border-radius: 15px; /* Webkit browser ...
- 【C#】分享一个可灵活设置边框的Panel
---------------------------更新:2014-05-19--------------------------- 优化了一下逻辑,就是既然可以通过设置BorderSide=Non ...
- 项目中的web api知识总结
最近在做公司的项目,自己负责webapi的框架的搭建与开发,最近很忙,一直没时间对工作中遇到的知识点缺少个总结,现总结一下,对自己是个提升,如果个人的小点点小总结能对博友有帮助那也是善莫大焉. (1) ...
- android listview 异步加载图片并防止错位
网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertVie ...
- Git合并特定commits 到另一个分支
https://ariejan.net/2010/06/10/cherry-picking-specific-commits-from-another-branch/ http://blog.csdn ...
- Bootstrap Table表格一直加载(load)不了数据-解决办法
bootstrap-table是一个基于Bootstrap风格的强大的表格插件神器,官网:http://bootstrap-table.wenzhixin.net.cn/zh-cn/ 这里列出遇到的一 ...
- JVM堆和栈的区别
物理地址 堆的物理地址分配对对象是不连续的.因此性能慢些.在GC的时候也要考虑到不连续的分配,所以有各种算法.比如,标记-消除,复制,标记-压缩,分代(即新生代使用复制算法,老年代使用标记--压缩) ...
- Linux命令详解之—more命令
Linux more命令同cat命令一样,多用来查看文件内容,本文就为大家介绍下Linux more命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux的more命令类似 ca ...