Android 多种ViewType的ListView
来源:互联网 发布:二个字 网络语言大全 编辑:程序博客网 时间:2024/05/16 17:43
原文链接:http://www.cnblogs.com/sw926/p/3426606.html?utm_source=tuicool&utm_medium=referral
一般复杂的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; }
运行效果
Demo下载
- Android 多种ViewType的ListView
- ListView的多种ViewType
- android recyclerview 关于viewtype的使用
- ListView中有不同的ViewType,它的convertView实现
- listview的重要属性viewtype,实现多类型item样式
- ListView优化之ViewType使用
- Android ListView添加多种类型的ItemView
- android 使用RecyclerView ViewType创建不同的item
- 深入了解ListView工作原理(二) -- 之convertView的ViewType篇
- 多种布局的ListView
- android listView的item 显示多种不同的布局
- Android ListView 显示多种数据类型
- Android ListView 实现多种布局
- Android ListView 多种布局--初步
- Android--listview多种类型item
- Android ListView加载多种布局
- 在Android的Listview中显示多种视图
- Android ListView中添加不同的多种布局
- Android Glide简单用法
- 一名猎头想对候选人说的心里话
- Android中ClassLoader和java中有什么关系和区别
- centos 6.5 部署tomcat 实现自动化部署
- CSS 笔记
- Android 多种ViewType的ListView
- hibernate基础
- Cassandra_教程一_Cassandra的简单操作_基于(cassandra-cli) 需要 2.2 及以下版本
- 使用Ajax时处理用户session失效的问题
- Android Studio下载和安装
- angularJS表单验证
- 互联网领域细分
- 笔试算法学习---超级楼梯(递推)
- Educational Codeforces Round 14 D. Swaps in Permutation