listview 在滚动过程中 不该加载图片


原文:

http://blog.csdn.net/fuweiping/article/details/7888924


我自己在使用过程中整理了下。 发现其保存到SD卡部分,工作不大正常。

1:  SyncImageLoader.java


import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;

import android.graphics.drawable.Drawable;
import android.os.Handler;

import com.efuture.staff.Global;
import com.efuture.staff.mylog.Log;

public class SyncImageLoader {
	private static final String TAG = "SyncImageLoader";

	private Object lock = new Object();

	private boolean mAllowLoad = true;

	private boolean firstLoad = true;

	private int mStartLoadLimit = 0;

	private int mStopLoadLimit = 0;

	final Handler handler = new Handler();

	private HashMap<String, SoftReference> imageCache = new HashMap<String, SoftReference>();

	public interface OnImageLoadListener {
		public void onImageLoad(Integer t, Drawable drawable);

		public void onError(Integer t);
	}

	public void setLoadLimit(int startLoadLimit, int stopLoadLimit) {
		if (startLoadLimit > stopLoadLimit) {
			return;
		}
		mStartLoadLimit = startLoadLimit;
		mStopLoadLimit = stopLoadLimit;
	}

	public void restore() {
		mAllowLoad = true;
		firstLoad = true;
	}

	public void lock() {
		mAllowLoad = false;
		firstLoad = false;
	}

	public void unlock() {
		mAllowLoad = true;
		synchronized (lock) {
			lock.notifyAll();
		}
	}

	public void loadImage(Integer t, String imageUrl,
			OnImageLoadListener listener) {
		final OnImageLoadListener mListener = listener;
		final String mImageUrl = imageUrl;
		final Integer mt = t;

		new Thread(new Runnable() {

			@Override
			public void run() {
				if (!mAllowLoad) {
					if (Global.DBG) {
						Log.e(TAG, "prepare to load");
					}
					synchronized (lock) {
						try {
							lock.wait();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}

				if (mAllowLoad && firstLoad) {
					loadImage(mImageUrl, mt, mListener);
				}

				if (mAllowLoad && mt <= mStopLoadLimit && mt >= mStartLoadLimit) {
					loadImage(mImageUrl, mt, mListener);
				}
			}

		}).start();
	}

	private void loadImage(final String mImageUrl, final Integer mt,
			final OnImageLoadListener mListener) {

		if (imageCache.containsKey(mImageUrl)) {
			SoftReference softReference = imageCache.get(mImageUrl);
			final Drawable d = (Drawable) softReference.get();
			if (d != null) {
				handler.post(new Runnable() {
					@Override
					public void run() {
						if (mAllowLoad) {
							mListener.onImageLoad(mt, d);
						}
					}
				});
				return;
			}
		}
		try {
			final Drawable d = loadImageFromUrl(mImageUrl);
			if (d != null) {
				imageCache.put(mImageUrl, new SoftReference(d));
			}
			handler.post(new Runnable() {
				@Override
				public void run() {
					if (mAllowLoad) {
						mListener.onImageLoad(mt, d);
					}
				}
			});
		} catch (IOException e) {
			handler.post(new Runnable() {
				@Override
				public void run() {
					mListener.onError(mt);
				}
			});
			e.printStackTrace();
		}
	}

	public static Drawable loadImageFromUrl(String url) throws IOException {
		
		URL m = new URL(url);
		InputStream i = (InputStream) m.getContent();
		Drawable d = Drawable.createFromStream(i, "src");
		return d;
	}
}


2: 我们自己的Activity 中:


private ListView mListView;
SyncImageLoader syncimageloader = new SyncImageLoader();


        mListView.setOnScrollListener(new OnScrollListener(){

            public void onScrollStateChanged(AbsListView view, int scrollState) {
                switch (scrollState) {  
                case AbsListView.OnScrollListener.SCROLL_STATE_FLING: 
                    if(Global.DBG){
                        Log.e(TAG,"SCROLL_STATE_FLING");  
                    }
                    syncimageloader.lock();  
                        break;  
                case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:  
                        if(Global.DBG){
                            Log.e(TAG,"SCROLL_STATE_IDLE");  
                        }
                        loadImage();  
                        //loadImage();  
                        break;  
                case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:  
                    syncimageloader.lock();  
                        break;  

                default:  
                        break;  
        }  
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
            }
            
        });


    public void loadImage(){  
        int start = mListView.getFirstVisiblePosition();  
        int end =mListView.getLastVisiblePosition();  
        if(end >= mListData.size()){  
                end = mListData.size() -1;  
        }  
        syncimageloader.setLoadLimit(start, end);  
        syncimageloader.unlock();  
}  













3:Adapter  (这种Adapter 没有使用ViewHolder)

	private class MyStoreGoodsAdapter extends BaseAdapter {
		public List<GoodsInfo> mData = new ArrayList<GoodsInfo>();
		
		private LayoutInflater inflater;
		private ImageLoader mImageLoader;
		
		SyncImageLoader.OnImageLoadListener imageLoadListener = new SyncImageLoader.OnImageLoadListener(){  
			  
	        @Override  
	        public void onImageLoad(Integer t, Drawable drawable) {  
	        	
	        	if(mListView!=null){
	        		View view = mListView.findViewWithTag(t);  
	        		if(view != null){  
	        			ImageView iv = (ImageView) view.findViewById(R.id.iv_mystore_goods_list_image);  
	        			
	        			iv.setBackgroundDrawable(drawable);  
	        		}  
	        	}
	        }  
	        @Override  
			public void onError(Integer t) {
	        	if(mListView!=null){
	        		View view = mListView.findViewWithTag(t);
	        		if (view != null) {
	        			ImageView iv = (ImageView) view
	        					.findViewById(R.id.iv_mystore_goods_list_image);
	        			iv.setBackgroundResource(R.drawable.icon);
	        		}
	        	}
			}  
	};  

		public MyStoreGoodsAdapter(Context pcontext) {
			inflater = LayoutInflater.from(pcontext);
			this.mImageLoader = new ImageLoader();
		}

		public void addData(List<GoodsInfo> datapiece){
			mData.addAll(datapiece);
			
			notifyDataSetChanged();
		}
		
		@Override
		public int getCount() {
			if (mData == null) {
				return 0;
			} else
				return mData.size();
		}

		@Override
		public Object getItem(int position) {
			if (mData == null) {
				return null;
			} else if (position < mData.size()) {
				return mData.get(position);
			} else
				return null;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(final int position, View pconvertView,
				ViewGroup parent) {
			
			if(Global.DBG){
				Log.e(TAG, "--getView()--"+position);
			}
			
	        if(pconvertView == null){  
				pconvertView = inflater.inflate(R.layout.mystore_goods_list_item, null);
	        } 
	        pconvertView.setTag(position);
	        
	        ImageView holder_iv_mystore_goods_list_image = (ImageView) pconvertView
					.findViewById(R.id.iv_mystore_goods_list_image);
	        TextView holder_tv_mystore_goods_list_title = (TextView) pconvertView
					.findViewById(R.id.tv_mystore_goods_list_title);
	        TextView holder_tv_mystore_goods_list_tags_num = (TextView) pconvertView
					.findViewById(R.id.tv_mystore_goods_list_tags_num);
	        TextView holder_tv_mystore_goods_list_fans_num = (TextView) pconvertView
					.findViewById(R.id.tv_mystore_goods_list_fans_num);
	        
	        GoodsInfo data = (GoodsInfo) mData.get(position);
	        
			String imgUrl = null;
			if (data.images.size() > 0)
				imgUrl = data.images.get(0);
			if (imgUrl != null && !imgUrl.equals("")) {
				if(!TextUtils.isEmpty(imgUrl)){
					imgUrl = imgUrl.replace(HttpConstants.ORI, HttpConstants.DEF_VALUE_75);
					
					syncimageloader.loadImage(position,imgUrl,imageLoadListener);  
				}
			}
			
			holder_tv_mystore_goods_list_title.setText(data.name);
			holder_tv_mystore_goods_list_tags_num.setText(String
					.valueOf(data.tags));
			holder_tv_mystore_goods_list_fans_num.setText(String
					.valueOf(data.fans));
			
			return pconvertView;
		}

	}


 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值