android listview 选择多个item,Android ListView添加多种类型的ItemView

一般复杂的ListView都会重写BaseAdapter,通过重用convertView来减少inflate,通过setTag()和ViewHolder改变ItemView的内容。

重写BaseAdapter必须要实现

public intgetCount()public Object getItem(intposition)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(intposition)public int getViewTypeCount()

看到这两个函数应该很多人都明白了,getViewTypeCount()就是获取列表有几种布局类型,getItemViewType(int position)是获取在position位置上的布局类型。

通过一个小Demo来测试一下,写一个有3中布局的列表,3中布局分别是TextView,EditText,Button,

首先实现列表的ListItem

61675182_1.gif

packagecom.example.testmultipletypelist;public classListItem {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;privateString name;private inttype;public ListItem(inttype, String name) {this.type =type;this.name =name;

}public intgetType() {returntype;

}publicString getName() {returnname;

}

}

61675182_1.gif

重写BaseAdapter中的getItemViewType()和getViewTypeCount()。

61675182_1.gif

@Overridepublic int getItemViewType(intposition) {if (list != null && position

}return super.getItemViewType(position);

}

@Overridepublic intgetViewTypeCount() {returnListItem.TYPE_COUNT;

}

61675182_1.gif

然后在getView()中,可以通过getItemViewType()来处理不同的布局

61675182_1.gif

@Overridepublic View getView(intposition, View convertView, ViewGroup parent) {int type =getItemViewType(position);switch(type) {caseListItem.TYPE_TEXT: {

TextViewHolder holder= null;if (convertView == null) {

convertView= activity.getLayoutInflater().inflate(R.layout.list_test_item, null);

holder= newTextViewHolder();

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;

}caseListItem.TYPE_EDIT: {

EditViewHolder holder= null;if (convertView == null) {

convertView= activity.getLayoutInflater().inflate(R.layout.list_edittext_item, null);

holder= newEditViewHolder();

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;

}caseListItem.TYPE_BUTTON: {

ButtonViewHolder holder= null;if (convertView == null) {

convertView= activity.getLayoutInflater().inflate(R.layout.list_button_item, null);

holder= newButtonViewHolder();

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;

}returnconvertView;

}

61675182_1.gif

运行效果

61675182_2.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值