一般复杂的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 ListView添加多种类型的ItemView的更多相关文章

  1. Android开发之ListView添加多种布局效果演示

    在这个案例中展示的新闻列表,使用到ListView控件,然后在适配器中添加多种布局效果,这里通过重写BaseAdapter类中的 getViewType()和getItemViewType()来做判断 ...

  2. Android进阶笔记11:ListView篇之ListView显示多种类型的条目(item)

    ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似. 1. 这是MainActivity,MainActivity的布局就是一个ListView,太简单了这里就不写了,直接 ...

  3. Android进阶笔记10:ListView篇之ListView显示多种类型的条目(item)

    ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似. 1. 这是MainActivity,MainActivity的布局就是一个ListView,太简单了这里就不写了,直接 ...

  4. ListView之多种类型Item

    一.概述 一般而言,listview每个item的样式是一样的,但也有很多应用场景下不同位置的item需要不同的样式. 拿微信举例,前者的代表作是消息列表,而后者的典型则是聊天会话界面. 本文重点介绍 ...

  5. ListView显示多种类型的item

    ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似 这是MainActivity:,MainActivity的布局就是一个ListView public class Mai ...

  6. Android ListView 显示多种数据类型

    ListView往往可能会有不同的数据类型,单类型的数据可能运用会比较少些,这也是最近项目中的一个需求{在发送消息的时候,需要选择联系人,而联系人列表由英文字母索引+联系人组成},上一篇文章只是一个基 ...

  7. android listview 添加数据

    <span style="white-space:pre"> </span>listView = (ListView) findViewById(R.id. ...

  8. Android ListView Adapter的getItemViewType和getViewTypeCount多种布局

     <Android ListView Adapter的getItemViewType和getViewTypeCount多种布局> 在Android的ListView中.假设在一个Lis ...

  9. Android之listview添加数据篇

    一.ListView: 1. ListView通常有两个职责: 1.向布局填充数据 2.处理选择点击等操作 2.ListView的创建需要3个元素: 1. ListView中的每一列的View. 2. ...

随机推荐

  1. Windows下ELK环境搭建(单机多节点集群部署)

    1.背景 日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因.经常分析日志可以了解服务器的负荷,性能安全性,从而及时 ...

  2. 实现iOS图片等资源文件的热更新化(零): 序

    必要的序 以后在写系列文章,准备把基本的规划和动机等,单独作为一个小的序言部分给独立出来.序言部分,可以较为完整地交待系列文章的写作动机,所展示的编码技术可能的应用场景等.个人,我还是比较看重文章或者 ...

  3. 【转载】谷歌酝酿将苹果Swift作为安卓APP主要开发语言

    TNW中文站 4月8日报道 安卓操作系统的软件开发语言是Java,而在过去几年中,有关Java的版权,谷歌(微博)和甲骨文之间发生了长期的诉讼.最新外媒消息称,谷歌正在考虑将苹果开发的Swift作为未 ...

  4. XML基础学习02<linq to xml>

    Linq to XML的理解 1:这是一种比较好的操作Xml的工具. àXDocument 文档 àXElement 元素 àXAttribute 属性 àXText 文本 2:这里还是和我们之前创建 ...

  5. C#三种判断字符是否为汉字的方法

    判断一个字符是不是汉字通常有三种方法,第一种用 ASCII 码判断,第二种用汉字的 UNICODE 编码范围判 断,第三种用正则表达式判断,以下是具体方法. 1.用ASCII码判断 在 ASCII码表 ...

  6. Lua使用心得(1)

    这几天研究了一下lua,主要关注的是lua和vc之间的整合,把代码都写好放在VC宿主程序里,然后在lua里调用宿主程序的这些代码(或者叫接口.组件,随便你怎么叫),希望能用脚本来控制主程序的行为.这实 ...

  7. grep命令的使用

    grep是UNIX和LINUX中使用最广泛的命令之一.grep允许对文本文件进行模式查找.如果找到匹配模式, grep打印包含模式的所有行.grep支持基本正则表达式,也支持其扩展集.grep有三种变 ...

  8. 本地电脑安装和配置Redis操作客户端

    下载需要的文件:http://pan.baidu.com/s/1gdfQePl 把这个下载下来解压就可以了,如图所示     第一步(配置本地服务) 点击run这个DOS执行命令 因为是自己的电脑测试 ...

  9. Web API:将FlexChart导出为图片

    如果想要将FlexChart在应用之外使用,比如使用在报表中,Web API帮助你将FlexChart导出成任何你需要的图片格式. 下面是实现的步骤: 1:创建FlexChart 2:调用Servic ...

  10. linux kernel: possible SYN flooding on port 8080. Sending cookie

    possible SYN flooding on port 7244. Sending cookie