注意:LruCache是有版本限制的,低版本的sdk需要在libs文件夹添加相应的support-4v文件。
本文改造的大部分是参考http://www.iteye.com/topic/1118828,感谢。
不废话直接上工程代码,内有关键注释,项目就不上传了,自己对照着上面网址改呗。
首先是Application文件,负责创建图片存储文件夹:
public class MyApp extends Application{ @Override public void onCreate() { super.onCreate(); File f = new File(Environment.getExternalStorageDirectory()+"/TestSyncListView/pic/"); if (!f.exists()) { f.mkdirs(); } } }
图像读取工具类:
|
线程辅助类:
|
使用类:
//
实例化工具类
SyncImageLoaderUtil
syncImageLoader = new
SyncImageLoaderUtil(mContext);
syncImageLoader.loadImage(position,
model.mPic, imageLoadListener);//应用接口:参数一是加载图片的位置;参数二是加载的ImageView;参数三是回调接口
//
map保存的键是位置,值是listview对应位置的布局
HashMap
map = new
HashMap();
map.put(position,
convertView);
SyncImageLoaderUtil.OnImageLoadListener
imageLoadListener = new
SyncImageLoaderUtil.OnImageLoadListener()
{
@Override
public
void
onImageLoad(Integer
t, Drawable drawable) {
View
view = (View) map.get(t);
if
(view
!= null
)
{
ImageView
iv = (ImageView) view.findViewById(R.id.image);
iv.setBackgroundDrawable(drawable);
}
}
@Override
public
void
onError(Integer
t) {
//
图片加载失败
//
取得listview对应的位置的行的内容布局
MusicModel
model = (MusicModel) getItem(t);
View
view = mListView.findViewWithTag(model);
if
(view
!= null
)
{
ImageView
iv = (ImageView) view.findViewById(R.id.image);
iv.setBackgroundResource(R.drawable.img_pic);
}
}
};
//
实现类而且需要实现OnScrollListener接口
public
void
loadImage()
{
//
不要在这里使用listview的getFirstVisiblePosition方法,位置不准
if
(end
>= getCount()) {
end
= getCount() - 1
;
}
syncImageLoader.setLoadLimit(start,
end);
syncImageLoader.unlock();
}
@Override
public
void
onScrollStateChanged(AbsListView
view, int
scrollState)
{
//
TODO Auto-generated method stub
if
(lodingView)
{
switch
(scrollState)
{
case
AbsListView.OnScrollListener.SCROLL_STATE_FLING:
syncImageLoader.lock();
break
;
case
AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
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)
{
//
在这里取得的位置较准确,不过也会出现特殊的奇疤机型是不行的
//
start与end是定义的变量
start
= firstVisibleItem;
end
= firstVisibleItem + visibleItemCount;
if
(firstVisibleItem
!= 0
)
{
//
lodingView是控制变量,用来控制第一次进来视图加载读取图片
lodingView
= true
;
}
else
{
lodingView
= false
;
loadImage();
}
}