@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
CacheView cacheView;
System.out.println(position+"======"+(convertView==null));
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item, null);
cacheView = new CacheView(convertView);
cacheView.setTag(position); //用于测试
convertView.setTag(cacheView);
} else {
cacheView = (CacheView) convertView.getTag();
}
System.out.println("cacheView.tag==="+cacheView.getTag());
}
上面的代码是adapter 中重写 getView ,一般情况下我们会通过上面的实现来优化listView。 对与每个item都先判断 convertView是否为空。 但到底这个convertView是什么东东??
开始的时候我以为convertView就是每一项的view,每项的convertView之间没有关系。 如果是这样的话那每项第一次出现的时候convertView都为空。但实际不是这样的。把上面的代码跑一遍就知道了。 那到底convertView是什么呢? 来看张图
ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的。
当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。
(如果 item1的边缘仍然可见(在顶端) convertView仍然是空值,因为recycler中没有视图)
就是这个样子!!
如果想实现奇数行和偶数行显示不同的颜色的功能,那应该怎么做呢?开始的时候我是这么做的:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = position % 2;
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case 0:
convertView = mInflater.inflate(R.layout.item1, null);
holder.textView = (TextView)convertView.findViewById(R.id.text);
break;
case 1:
convertView = mInflater.inflate(R.layout.item2, null);
holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.textView.setText(getItemViewType(position)+"");
return convertView;
}
显然,通过上面的操作我们知道 只 这样做是不行的。 会出现错乱。 不过也很好解决。 我们只需要重写 BaseAdapter 的 getItemViewType(int) 和
getViewTypeCount()即可。
getItemViewType(int) 官方解释: get the type of View that will be create by getView(int,View,ViewGroup) for the specified item.
@Override
public int getItemViewType(int position) {
if(position % 2 == 0 ){
return 0;
}
return 1;
@Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
系统每次调用getView的时候都会去调getItemViewType。getViewTypeCount()方法只会调用一次.
谢谢 这篇文章: http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html