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. ...
随机推荐
- C# Socket系列二 简单的创建 socket 通信
看了系列一 我们开启了对socket tcp的监听状态,那么这一章我们来讲解怎么创建socket的通信代码 我新建一个类 TSocketBase public abstract class TSock ...
- 前端scss的使用及gulp发布方式
如标题所述,这篇博文是说scss以及gulp发布方式: 如果你没用过scss和gulp或不甚了解,你可以看看这篇博文,叙说的水平有限,各位看官大神见谅: 说scss之前,先来说说sass,sass是一 ...
- 画一画javascript原型链
在javascript中,几种数据类型String,Number,Boolean,Object,Function都是函数,可称之为函数对象. 可以说拥有prototype属性的都是函数. 所有对象都拥 ...
- Get sdcard directory by adb
解决方案: adb shell echo $EXTERNAL_STORAGE I am making an application, which pulls files(Saved by andro ...
- asp.net页面后退,重复弹出上一页对话框处理办法
我们在实例中,虽然页面内有导航,但是用户使用的时候难免会使用浏览器的后退按钮. 时常会发现,当后退的时候,上一页的对话框会自动弹出,下面是解决办法. 问题:使用此js代码,后退按钮时,重复显示对话框内 ...
- Intellij Idea上传本地项目到Git
方法一:选择菜单VCS-Import into Version Control - Share project on Github,填写仓库名和github账户之后,点击"Share&quo ...
- Scalaz(25)- Monad: Monad Transformer-叠加Monad效果
中间插播了几篇scalaz数据类型,现在又要回到Monad专题.因为FP的特征就是Monad式编程(Monadic programming),所以必须充分理解认识Monad.熟练掌握Monad运用.曾 ...
- SSH中的jar包讲解(1)
我们在搭建SSH框架的时候,需要引入各自的一些jar包,相信很多初学者跟我一样,搜个资料,照搬过来(当然版本还得对应),至于为什么要引入这些个jar包,引入它们的作用是啥子,一头雾水,今天我就来跟这些 ...
- Python私有变量
# 访问限制的保护,代码更加健壮 class Student(object): def __init__(self,name,score): self.__name= name self.__scor ...
- GJM :用JIRA管理你的项目(三)基于LDAP用户管理 [转载]
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...