在ListView中使用多个布局
要想在一个ListView中使用多个布局文件,比如一个信息List包含了一个信息标题和每个信息对应的时间.
关键的步骤是实现Adapter类的getItemViewType 和getViewTypeCount 这两个方法
getItemViewType(int)
以int数值型返回itemView的类型。一般普通列表的item都是一样的布局,也就是说这个列表只有一种类型,但是很多时候我们需要列表显示不同的item,比如有的列表有普通item和separator两种类型,item用于响应用户点击事件,separator用于分隔item,不可以点击,这样这个列表就有了两种类型,重载这个方法,如果当前位置是item,我们可以返回1,如果是separator我们可以返回2,以此类推。重写getItemViewType方法,这个方法返回0到getViewTypeCount()-1之间的数字或者IGNORE_ITEM
getViewTypeCount()
返回这个Adapter将处理的itemView类型的总个数
1.首先定义一个接口,List中每一个Item项都必须实现它里面的getViewType和getView方法分别表示使用何种类型的View显示,以及如何新建和回收。
public interface Item {
public int getViewType();
public View getView(View convertView);
}
2.在Adapter中维护一个实现Item接口的List对象
public class MyListAdapter extends ArrayAdapter<Item> {
private List<Item> items;
private LayoutInflater inflater;
public enum RowType {
// Here we have two items types, you can have as many as you like though
LIST_ITEM, HEADER_ITEM
}
public MyListAdapter(Context context, LayoutInflater inflater, List<Item> items) {
super(context, 0, items);
this.items = items;
this.inflater = inflater;
}
@Override
public int getViewTypeCount() {
// Get the number of items in the enum
return RowType.values().length;
}
@Override
public int getItemViewType(int position) {
// Use getViewType from the Item interface
return items.get(position).getViewType();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Use getView from the Item interface
return items.get(position).getView(inflater, convertView);
}
}
3.现在创建一个标题类实现Item接口
public class Header implements Item {
private final String name;
public Header(String name) {
this.name = name;
}
@Override
public int getViewType() {
return RowType.HEADER_ITEM.ordinal();
}
@Override
public View getView(LayoutInflater inflater, View convertView) {
if (convertView == null) {
// No views to reuse, need to inflate a new view
convertView = (View) inflater.inflate(R.layout.header, null);
}
TextView text = (TextView) convertView.findViewById(R.id.headerText);
text.setText(name);
return convertView;
}
}
4.创建一个信息类实现Item接口
public class EventItem implements Item {
private final String str1;
private final String str2;
public EventItem(String text1, String text2) {
this.str1 = text1;
this.str2 = text2;
}
@Override
public int getViewType() {
return RowType.LIST_ITEM.ordinal();
}
@Override
public View getView(LayoutInflater inflater, View convertView) {
if (convertView == null) {
convertView = (View) inflater.inflate(R.layout.list_item, null);
}
TextView text1 = (TextView) convertView.findViewById(R.id.list_content1);
TextView text2 = (TextView) convertView.findViewById(R.id.list_content2);
text1.setText(str1);
text2.setText(str2);
return convertView;
}
}
5.最后是Activity的实现
public class MainActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LayoutInflater inflater = LayoutInflater.from(this);
List<Item> items = new ArrayList<Item>();
items.add(new Header("Friday - November 30th 2012"));
items.add(new EventItem("8:30am" , "Start work"));
items.add(new EventItem("9:15am" , "Call Bob"));
items.add(new EventItem("11:00am", "Meeting with Joe"));
items.add(new EventItem("5:00pm" , "Freedom!"));
items.add(new Header("Saturday - December 1st 2012"));
items.add(new EventItem("8:30am" , "Keep sleeping"));
items.add(new EventItem("10:00am", "Wake up"));
items.add(new EventItem("11:00am", "Walk the dog"));
items.add(new EventItem("6:00pm" , "Dinner at John's"));
items.add(new Header("Sunday - December 2rd 2012"));
items.add(new EventItem("8:30am" , "Keep sleeping"));
items.add(new EventItem("10:00am", "Wake up"));
items.add(new EventItem("11:00am", "Walk the dog"));
items.add(new EventItem("6:00pm" , "Dinner at John's"));
items.add(new Header("Monday - December 3rd 2012"));
items.add(new EventItem("8:30am" , "Start work"));
items.add(new EventItem("9:15am" , "Call Bob"));
items.add(new EventItem("11:00am", "Meeting with Joe"));
items.add(new EventItem("5:00pm" , "Freedom!"));
MyListAdapter adapter = new MyListAdapter(this, inflater, items);
setListAdapter(adapter);
}
}
在ListView中使用多个布局的更多相关文章
- android代码优化----ListView中自定义adapter的封装(ListView的模板写法)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Android ListView中 每一项都有不同的布局
实现代码 Adapter的代码 其中:ViewHolder分别是三个不同的布局,也就是ListView中每一项的布局 TYPE_1...是三种类型. 在使用不同布局的时候,getItemViewTyp ...
- Android开发-Listview中显示不同的视图布局
1. 使用场景 在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能.convertView在Item为单一的同种类型布局时,能够 ...
- ListView中嵌入布局的Button或多个点击事件
有时候在ListView嵌入的布局中有多个事件需要点击,比如一个item中有TextView和Button两个布局,当我们需要获取这两个点击事件时,我们应该如何去获取呢,通常来说,我们都是已经固定好了 ...
- Android ListView中添加不同的多种布局
最近做项目要使用ListView加载不同的布局,由于自己写的代码不能贴出,故找了一篇自认为比较好的blog给分享出来,希望对用到此项技术的同学有点帮助. http://logc.at/2011/10/ ...
- ListView中动态显示和隐藏Header&Footer
ListView的模板写法 ListView模板写法的完整代码: android代码优化----ListView中自定义adapter的封装(ListView的模板写法) 以后每写一个ListView ...
- Android 如何在 ListView 中更新 ProgressBar 进度
=======================ListView原理============================== Android 的 ListView 的原理打个简单的比喻就是: 演员演 ...
- Android,LIstView中的OnItemClick点击无效的解决办法
在List_Item布局文件中的根节点加上如下背景标黄的这一行 <?xml version="1.0" encoding="utf-8"?> < ...
- Android 实现ListView中Item被单击后背景色保持高亮
今天为了解决一个需求,就是我有一个slidingDrawer,里面是一个ListView.然后,单击其中的Item,默认只是显示一个橙色背景后就恢复了.客户便有着个需求,需要单击这个Item的背景高亮 ...
随机推荐
- Bootstrap--组件之按钮组
什么是按钮组呢?简单解释:就是把一堆的按钮放在一行或者一列中.下面来看一个实例. 按钮组嘛,首先是按钮,所以会用到.btn这个类,还有就是bootstrap提供的按钮组.btn-group这个类,所以 ...
- 自己写的demo---equals()跟==的区别
package equals; /*public class equals { //基本数据类型跟引用数据类型(复合数据类型), //在引用数据类型中equals方法被重写,一般用来比较内存地址 pu ...
- SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问
sql server 2005: EXEC sp_configure N'show advanced options', N'1' RECONFIGURE WITH OVERRIDEEXEC sp_c ...
- 使用PDO连接多种数据库
在PHP 5之前,想要连接MySQL数据库就需要使用mysql或mysqli等一系列函数来操作数据库.例如,我们使用mysql系列数据库函数进行查询操作,对应的示例代码如下: <?php //创 ...
- selenium2.0处理case实例(一)
通过自动化脚本, 判断下拉框选项值是否按照字母顺序(忽略大小写)显示 case场景如下: 1)打开www.test.com;2)判断下拉框选项是否按照字母顺序排列(忽略大小写)3)选择其中一个任意选项 ...
- 在js中window.open通过“post”传递参数
在js中window.open通过“post”传递参数的步骤如下: 如:在A.jsp中 有一个js方法 winow.open,目标地址是 xx.do 1.在A.jsp建一个form,把要设置的值通过j ...
- Mysql笔记【3】-SQL约束
SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). 我们将主要探讨以下几种约 ...
- gcc命令以及makefile文件
(一)makefile里涉及到的gcc命令 gcc -I./inc:指定头文件寻找目录 将按照 ./inc --> /usr/include --> /usr/local/include的 ...
- UEditor富文本编辑框学习
1.首先需要引入CSS.JS <!--富文本编辑框--> <link href="${pageContext.request.contextPath}/css/plugin ...
- 【转】关于oracle with as用法
原文链接:关于oracle with as用法 with as语法–针对一个别名with tmp as (select * from tb_name) –针对多个别名with tmp as (se ...