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

来源:互联网 发布:淘宝如何解除绑定 编辑:程序博客网 时间:2024/04/29 20:55

原文:

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() {@Overridepublic 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 blocke.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() {@Overridepublic 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() {@Overridepublic void run() {if (mAllowLoad) {mListener.onImageLoad(mt, d);}}});} catch (IOException e) {handler.post(new Runnable() {@Overridepublic 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();}@Overridepublic int getCount() {if (mData == null) {return 0;} elsereturn mData.size();}@Overridepublic Object getItem(int position) {if (mData == null) {return null;} else if (position < mData.size()) {return mData.get(position);} elsereturn null;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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;}}


 

原创粉丝点击