天天看點

Listview 異步加載圖檔 快速滑動發生圖檔錯誤的解決辦法 複用convertview

參考 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 ,圖檔可能會顯示不全。