之前替生燕做个小工具,为了方便,需要用到对不同item采取不同布局的listview,这对于我这个半吊子来说还是太难了。采取了很多方法,都没奏效,最多的情况是,偶发性地出现各种各样奇奇怪怪的布局。
后来最初采取的解决方案是这样的,无论现在的item是否已经绘制出来,都重新绘制一遍。这样就可以保证该item是我们需要的item。但是缺点也很显而易见,就是严重耗费资源,跟listview的设计思想可谓南辕北辙。不过话说我们做个小工具,其实这种效率问题也可以打马虎眼过去。
convertView ==
null
;
convertView = mInflater.inflate(R.layout.item1,
null
);
holder =
new
ViewHolder();
holder .textView = (TextView)convertView.findViewById(R.id.text );
大概就是上面那样子。
但是本着闲着蛋疼的做人原则,我觉得有必要把真正的实现方法找出来。
http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html。大概就是,
- 重(@Override)写 getViewTypeCount() – 返回你有多少个不同的布局
- 重写 getItemViewType(int) – 由position返回view type id
- 根据view item的类型,在getView中创建正确的convertView
@Override
public
int
getItemViewType(
int
position) {
return
mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
}
@Override
public
int
getViewTypeCount() {
return
TYPE_MAX_COUNT;
}
........
if
(convertView ==
null
) {
holder =
new
ViewHolder();
switch
(type) {
case
TYPE_ITEM:
convertView = mInflater.inflate(R.layout.item1,
null
);
holder.textView = (TextView)convertView.findViewById(R.id.text);
break
;
case
TYPE_SEPARATOR:
convertView = mInflater.inflate(R.layout.item2,
null
);
holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);
break
;
}
convertView.setTag(holder);
}
else
{
holder = ( ViewHolder)convertView.getTag();
}