一 ListView使用Holder优化
在adapter中覆写getView方法,例如:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = mInflater.inflate(R.layout.listview_item, null);
viewHolder.itemTextView = (TextView) convertView.findViewById(R.id.item_textview);
viewHolder.itemImageView = (ImageView) convertView.findViewById(R.id.item_imageview);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
String value = String.valueOf( getItem(position) );
viewHolder.itemTextView.setText( value );
viewHolder.itemImageView.setImageResource(R.drawable.ic_launcher);
return convertView;
}
其中converView会反复使用,目的是为了提高ListView效率。但是也会造成异步加载数据后,绑定到相应view会出现item显示顺序混乱问题。
疑问?
从代码分析converView是否复用? 如果是,又怎么复用的?
如果复用猜测肯定用一个数据结构类似堆栈‘先入后出’保存这些View,需要反复使用的时候在依次取出当前没有使用的View
二 分析源码,解决疑问
1. adapter是通过setAdapter与ListView绑定到一起的,先来看ListView.setAdapter部分源码
public void setAdapter(ListAdapter adapter) {
......