您的位置:首页 > 移动开发 > Android开发

Android 多种ViewType的ListView

2016-09-08 19:38 435 查看
原文链接: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下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: