原文链接: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下载

更多相关文章

  1. Android学习笔记_34_自定义窗口标题
  2. Android中fragment+viewpager实现布局
  3. Android(安卓)Toast花式使用
  4. 第一行代码阅读笔记---详解分析第一个Android程序
  5. Android(安卓)RecyclerView的StaggeredGridLayoutManager和CardV
  6. Android自定义键盘之汉字键盘
  7. android for opencv (2) byte[] ,Bitmap 与 Mat 类型转换,Bitmap保
  8. Android(安卓)启动画面跳转和去掉标题栏
  9. Android(安卓)Rect和RectF的区别

随机推荐

  1. Android中在sdcard上创建文件夹,注意加权
  2. Android翻页效果原理实现之引入折线
  3. Android 获取imei号码,获取手机型号和系统
  4. Android 读取通信录号码
  5. Android输入框格式化Edittexthelp(有项目
  6. android 从EditText中获取内容
  7. Gradle sync failed: Could not find com
  8. Android 退出提示框 代码
  9. android 内存使用详情查询的几种方法
  10. Android ListView 分类显示(二)多布局显示