參考 http://www.3lian.com/edu/2013/08-03/86585.html
說明了複用convertview的後果,并給出了解決辦法。通過給imageview設定tag,線上程更新時判斷tag來覺得是否顯示圖檔。
但這樣并不能解決問題,因為快速滑動後convertview 會把之前position的那個完全複制過來,是以要想顯示圖檔不錯位,隻要先隐藏imageview就行了。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = inflate.inflate(R.layout.note_list_item, parent,
false);
holder = new ViewHolder();
holder.img = (ImageView) convertView
.findViewById(R.id.note_listitem_img);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.img.setVisibility(View.INVISIBLE);
holder.position = position;
...
holder.img.setTag(Integer.valueOf(position));
String path = nr.imgpath;
if (path != null && (!path.equals("null"))) {
LayoutParams param = holder.titleAndContent.getLayoutParams();
// Log.d("param", "param.width = " + param.width);
param.width = 500;
// img.setVisibility(View.INVISIBLE);
if (listitem_imgs.get(position) == null) {
// Log.d("test", "" + position + " excute task");
new LoadSingleImageTask(position, path, holder.img)
.execute();
} else {
// Log.d("test", "position "+position+" not async show");
ListItemImg item = listitem_imgs.get(position);
if (item.bm != null) {
holder.img.setImageBitmap(item.bm);
holder.img.setVisibility(View.VISIBLE);
}
}
} else {
LayoutParams param0 = holder.img.getLayoutParams();
holder.img.setVisibility(View.GONE);
LayoutParams param1 = holder.titleAndContent.getLayoutParams();
// Log.d("param", "param.width = " + param.width);
param1.width = 500 + param0.width;
// img.setLayoutParams(null);
}
這樣剛加載到converview就會把之前的imageview的内容隐藏掉,而真正的内容在加載後再把imageview 顯示出來。
親測這樣就不會顯示之前position的圖檔了,但是用asynctask做異步效果不是很好,以後可以用線程池試下後再得出結論。
至于不複用convertview 會出現bug ,圖檔可能會顯示不全。