Phi*_*oda 4 android lag smooth-scrolling android-listview universal-image-loader
我正在使用包含图像的ListView.这些图像是从适配器内的Internet加载的.因此我使用的是UniversalImageDownloader.
不幸的是,只要我向下滚动必须下载新内容的地方,ListView的滚动就会"拖延"一段时间.
我实际上期望像ListView滚动的行为非常流畅,但是Image的加载当然可以花费更多的时间 - 这不应该影响滚动的平滑性.
此外,当我向后滚动时,也会出现滞后现象.好像图像没有正确缓存.
也许我的ImageLoader选项设置错误了?
我在适配器上做错了吗?
ListView包含大约20-30张图片,尺寸为640x320(约150kb)
您可以在下面看到我的适配器以及ImageLoader.(Downloader类只是UniversalImageDownloader的包装类)
public class Downloader {
/**
* initializes the imagedownloader with a specific configuration
* I CALL THIS METHOD RIGHT AFTER APP STARTUP
* @param c
*/
public static void initialize(Context c) {
// Create global configuration and initialize ImageLoader with this configuration
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(c)
.threadPoolSize(20)
.threadPriority(Thread.NORM_PRIORITY) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.memoryCacheSize(20 * 1024 * 1024)
.memoryCacheSizePercentage(15) // default
.discCacheSize(20 * 1024 * 1024)
.discCacheFileCount(100)
.discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
.imageDecoder(new BaseImageDecoder()) // default
.build();
ImageLoader.getInstance().init(config);
}
/**
* gets the display options that are needed when displaying an image
* @return
*/
public static DisplayImageOptions getDisplayOptions() {
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.error)
.showImageOnFail(R.drawable.error)
.resetViewBeforeLoading(false) // default
.cacheInMemory(true) // default
.cacheOnDisc(true) // default
.build();
return options;
}
public static ImageLoader getInstance() {
return ImageLoader.getInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
和适配器:
public class EventListAdapter extends ArrayAdapter<Event> {
private List<Event> mList;
private DisplayImageOptions options;
public EventListAdapter(Context context, int list_item_resource, List<Event> objects) {
super(context, list_item_resource, objects);
mList = objects;
options = Downloader.getDisplayOptions();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Event event = mList.get(position);
// A ViewHolder keeps references to children views to avoid unneccessary calls to findViewById() on each row.
ViewHolder holder = null;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.normalevent_list_item, parent, false);
holder = new ViewHolder();;
holder.eventimage = (ImageView) convertView.findViewById(R.id.ivEventImage);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (event != null) {
holder.eventimage.setImageResource(R.drawable.loading);
// Load image, decode it to Bitmap and display Bitmap in ImageView
Downloader.getInstance().displayImage(event.getImageOneURL(), holder.eventimage, options);
}
return convertView;
}
private static class ViewHolder {
ImageView eventimage;
}
}
Run Code Online (Sandbox Code Playgroud)
我有与图像下载相同的问题.我通过在DisplayImageOptions中设置delayBeforeLoading(1000)来解决它.当用户停止投掷时需要开始下载.
所以尝试用这个替换你的getDisplayOptions方法
public static DisplayImageOptions getDisplayOptions() {
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.error)
.showImageOnFail(R.drawable.error)
.delayBeforeLoading(1000)
.resetViewBeforeLoading(false) // default
.cacheInMemory(true) // default
.cacheOnDisc(true) // default
.build();
return options;
}
Run Code Online (Sandbox Code Playgroud)
文档还建议使用此代码来避免网格/列表视图滚动滞后
boolean pauseOnScroll = false; // or true
boolean pauseOnFling = true; // or false
PauseOnScrollListener listener = new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling);
listView.setOnScrollListener(listener);
Run Code Online (Sandbox Code Playgroud)
你可以在这里阅读("实用信息"列表的最后一项)
所以你可以使用这种方法之一
| 归档时间: |
|
| 查看次数: |
3293 次 |
| 最近记录: |