Android ListView异步加载图片乱序问题,原因分析及解决方案(二)

延引自:

adapter中重要的代码片段:
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		Map<String,Object> entity1 = null;
		Map<String,Object> entity2 = null;
		if (position == 0) {
			
			entity1 = menu_list.get(position);
			if (position + 1 < menu_list.size()) entity2 = menu_list.get(position + 1);
			
		} else {
			int pos = position*2;
			entity1 = menu_list.get(pos);
			if (pos+1 < menu_list.size() ) entity2 = menu_list.get(pos+1);
			
		}
			
		final Map<String,Object> entity1_final = entity1;
		final Map<String,Object> entity2_final = entity2;
		
		ViewHolder holder;
		if (convertView == null ) {
			holder = new ViewHolder();
			convertView = inflater.inflate(R.layout.correcting_my_collecting_shops_item, null);
			holder.icon1 = (ImageView) convertView
					.findViewById(R.id.shop_icon1);
			holder.icon2 = (ImageView) convertView
					.findViewById(R.id.shop_icon2);
			holder.name1 = (TextView) convertView
					.findViewById(R.id.shop_name1);
			holder.name2 = (TextView) convertView
					.findViewById(R.id.shop_name2);
			holder.position1 = (TextView) convertView
					.findViewById(R.id.shop_position1);
			holder.position2 = (TextView) convertView
					.findViewById(R.id.shop_position2);
			holder.second = (LinearLayout) convertView.findViewById(R.id.second);
			holder.one = (LinearLayout) convertView.findViewById(R.id.one);
			holder.shopNumTitle1 = (TextView) convertView.findViewById(R.id.shop_num_title1);
			holder.shopNumTitle2 = (TextView) convertView.findViewById(R.id.shop_num_title2);
			
			<strong>holder.icon1.setImageResource(R.drawable.pic_1x1);
			holder.icon2.setImageResource(R.drawable.pic_1x1);</strong>
			
			convertView.setTag(holder);
		}else{
			holder = (ViewHolder) convertView.getTag();
			<strong>holder.icon1.setImageResource(R.drawable.pic_1x1);
			holder.icon2.setImageResource(R.drawable.pic_1x1);</strong>
		}
		
		if (entity1!=null) {
			
			holder.one.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					//Toast.makeText(context, entity1_final.get("per_data").toString(), Toast.LENGTH_SHORT).show();
					Intent it = new Intent((Activity)context, C_GoodsDetailActivity.class);
					it.putExtra("per_data", entity1_final.get("per_data").toString());
					//Log.e("per_dataXXXXXXX", entity1_final.get("per_data").toString());
					context.startActivity(it);
				}
			});
			try {
				
				<strong>if (!StringUtil.isEmpty(entity1.get("icon").toString())) {
					holder.icon1.setTag(entity1.get("icon").toString());
					BitmapManage.getInstance(context).get(entity1.get("icon").toString(), holder.icon1);
				}</strong>
				else 
					holder.icon1.setImageResource(0);
				DisplayMetrics dm  = new DisplayMetrics();
				((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);
				LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(dm.widthPixels/2,dm.widthPixels/2);
				holder.icon1.setLayoutParams(llp);
				
			} catch (Exception e) {
			}
			holder.name1.setText(entity1.get("name").toString());
			if (context.getClass().getName().equals(PGGMallFoundingActivity.class.getName())){
				holder.position1.setVisibility(View.INVISIBLE);
				holder.shopNumTitle1.setVisibility(View.INVISIBLE);
			} else {
				holder.position1.setVisibility(View.VISIBLE);
				holder.shopNumTitle1.setVisibility(View.VISIBLE);
			}
			
			holder.position1.setText(entity1.get("position").toString());
			
		}
		
		if (entity2!=null) {
			holder.second.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					//Toast.makeText(context, entity2_final.get("per_data").toString(), Toast.LENGTH_SHORT).show();
					Intent it = new Intent((Activity)context, C_GoodsDetailActivity.class);
					it.putExtra("per_data", entity2_final.get("per_data").toString());
					context.startActivity(it);
				}
			});
			holder.second.setVisibility(View.VISIBLE);
			holder.second.setClickable(true);
			try {
				
				<strong>if (!StringUtil.isEmpty(entity2.get("icon").toString())) {
					holder.icon2.setTag(entity2.get("icon").toString());
					BitmapManage.getInstance(context).get(entity2.get("icon").toString(), holder.icon2);
				}</strong>
				else 
					holder.icon2.setImageResource(0);
				DisplayMetrics dm  = new DisplayMetrics();
				((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);
				LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(dm.widthPixels/2,dm.widthPixels/2);
				holder.icon2.setLayoutParams(llp);
				
			} catch (Exception e) {
			}
			if ( entity2.get("name")!= null ) 
				holder.name2.setText(entity2.get("name").toString());
			if ( entity2.get("position")!= null ) 
				holder.position2.setText(entity2.get("position").toString());
			
			if (context.getClass().getName().equals(PGGMallFoundingActivity.class.getName())){
				holder.position2.setVisibility(View.INVISIBLE);
				holder.shopNumTitle2.setVisibility(View.INVISIBLE);
			} else {
				holder.position2.setVisibility(View.VISIBLE);
				holder.shopNumTitle2.setVisibility(View.VISIBLE);
			}
			
		} else {
			holder.second.setVisibility(View.INVISIBLE);
			holder.second.setClickable(false);
		}
		
		return convertView;
	}

	class ViewHolder {
		ImageView icon1;
		ImageView icon2;
		TextView name1;
		TextView name2;
		TextView position1;
		TextView position2;
		LinearLayout second ;
		LinearLayout one;
		TextView shopNumTitle1;
		TextView shopNumTitle2;
	}

在异步加载图片的时候:
if (bitmap != null) {
					String key = MD5.getMD5(url) + isScale;
					put(key, bitmap);
					if (view instanceof ImageView) {
						
						//listview adapter 的错位调换机制
						//1.其他地方调用加载位图,肯定没有进行imageView.setTag(), 得到的tag是null时,代表直接加载即可,
						//否则就是listview的bitmap加载 ,imageView中的tag  和  当前的url是一致的时候才给加载。
						//2.有缓存的话,直接加载缓存的内容,不进行重新加载图片,不会出现这个问题 
						boolean isListViewCanLoad = ( view.getTag() != null && url.equals(view.getTag()) );
						boolean isOtherCanload = view.getTag() == null; 
						if (isOtherCanload  || isListViewCanLoad ) {
							((ImageView) view).setImageBitmap(bitmap);
							Log.e(view.getTag() + " = " + url);
						}
						
					}
					else
						view.setBackgroundDrawable(new BitmapDrawable(bitmap));
				}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值