我有一个列表视图,它显示带有缩略图图像的视频,我使用光标适配器(使用ContentProvider获取)。问题是随着列表项数量的增加,列表视图性能变得非常差。请让我知道使其延迟加载的最佳方法。
新:我终于找到了一些解决办法。这对我来说很好。如果你有什么建议,请告诉我。我的新代码在这里。(它使用具有生产者-消费者模式和bacground线程的堆栈进行处理)
@覆盖公共空bindView(视图视图、上下文上下文、光标){
ViewHolder holder = (ViewHolder) view.getTag();
String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));
holder.getIdView().setText(name);
holder.getThumbView().setTag((Integer)id);
if(LazyLoader.getInstance().containsKey(id)) {
Object bitmap = LazyLoader.getInstance().getBitMap(id);
if(null != bitmap && (bitmap instanceof Bitmap)) {
holder.getThumbView().setImageBitmap((Bitmap)bitmap);
} else {
holder.getThumbView().setImageDrawable(null);
}
} else {
holder.getThumbView().setImageDrawable(null);
LazyItem lazyItem = new LazyItem();
lazyItem.setId(id);
lazyItem.setThumbNail(holder.getThumbView());
LazyLoader.getInstance().putItem(lazyItem);
}
}
public class LazyLoaderHelper extends Thread {
private ContentResolver resolver = null;
private Activity activity;
private boolean isActive = true;
ExecutorService executor;
public LazyLoaderHelper(Activity _activity , ContentResolver _resolver) {
resolver = _resolver;
activity = _activity;
isActive = true;
executor = Executors.newFixedThreadPool(10);
}
public void stopThread() {
isActive = false;
executor.shutdown();
}
@Override
public void run() {
while (isActive) {
if(LazyLoader.getInstance().getSize() > 0) {
final LazyItem lazyItem = LazyLoader.getInstance().getItem();
if(null != lazyItem) {
executor.execute(new Runnable() {
@Override
public void run() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
if ((null != resolver) && (null != activity)) {
final Bitmap thumb = MediaStore.Video.Thumbnails.getThumbnail(resolver, lazyItem.getId(), MediaStore.Video.Thumbnails.MICRO_KIND, options);
if (null != thumb) {
LazyLoader.getInstance().putBitMap(lazyItem.getId(), thumb);
} else {
LazyLoader.getInstance().putBitMap(lazyItem.getId(), new Object());
}
if ((Integer) lazyItem.getThumbNail().getTag() == lazyItem.getId()) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (null != thumb) {
lazyItem.getThumbNail().setImageBitmap(thumb);
} else {
lazyItem.getThumbNail().setImageDrawable(null);
}
}
});
}
}
}
});
}
}
}
}
}
更多关于平滑列表滚动的信息在这里
您可以使用picaso library for android,它是开源的,可以轻松地与应用程序集成,您可以从下面的链接从github下载该库
http://square.github.io/picasso/
并且可以通过在列表视图适配器中使用以下方法轻松实现延迟加载
毕加索支持下载和错误占位符作为可选功能。
Picasso.with(上下文)。加载(url)。占位符(R.drawable.user_placeholder)。错误(R.drawable.user_placeholder_error)。
资源、资产、文件和内容提供者都支持作为图像源。
毕加索使用(上下文)。加载(R.drawable.landing\u屏幕)。进入(imageView1);毕加索使用(上下文)。加载(“file:///android_asset/DvpvklR.png“).into(imageView2);Picasso.with(context)。load(新文件(…)”。进入(imageView3);
问题内容: 我正在使用ListView来显示一些图像和与这些图像相关的标题。我正在从互联网上获取图像。有没有一种方法可以延迟加载图像,以便在显示文本时不阻止UI并在下载图像时显示它们? 图像总数不固定。 问题答案: 这是我创建的用于保存应用程序当前正在显示的图像的内容。请注意,此处使用的“ Log”对象是我在Android内部最终Log类周围的自定义包装。
问题内容: 这是一个非常常见的场景:在ListView中显示必须从Internet下载的图像。 现在,我有一个用于ArrayView的自定义子类ArrayAdapter。在ArrayAdapter的getView()实现中,我产生了一个单独的线程来加载图像。加载完成后,它将查找适当的ImageView并使用ImageView.setImageDrawable()设置图像。因此,我使用的解决方案与此
我似乎不能为我的生活得到任何图像懒惰加载插件在wordpress工作。我尝试了懒负载,wp懒负载和bj懒负载。网站上的图像似乎没有一个是“懒惰加载”的。我也使用审计工具(chrome审计)测试了这个。当我删除图像(每页大约有50张图像)时,我的审计绩效和其他分数为99。当我加载图像(使用wordpress循环),我的性能下降到64. 我尝试了每一个延迟加载插件,但它们似乎都不是延迟加载。我正在本地
问题内容: 如果这是完全相同的内容,请纠正我,我知道这个话题经常被讨论,但是找不到确切的答案。 问题: 在MVC Web应用程序中处理Hibernate对象的最佳实用解决方案是什么? 细节: 我正在使用Hibernate,并希望在可能的情况下利用延迟加载。 我正在使用MVC风格的webapp。 我讨厌获得延迟加载初始化异常。 我讨厌不得不在事务之间重新连接Hibernate对象。 选项: 渴望装载
问题内容: 我正在开发一个eshop。在基于类别的产品页面上,我放置了一些基于javascript的过滤器。但是,如果类别具有很多产品,则会出现问题。该链接具有与我相似的功能… 这个页面多么缓慢,却超过2mb !!! 对我来说,每个产品都需要一半的K字节,但是图像是个问题。.因此,我正在寻找如何延迟加载图像的方法。由于与该网站不同,我的页面具有分页功能,因此我认为加载仅对页面可见的图像是一种解决方
我试图使用jQuery懒惰加载在我的Laravel/Vue项目,但我正在努力让图像出现在我的Vue组件。我有以下img块,我认为会工作: 我确实在这里发现了另一个问题-Vue.js模板中的静态图像src-但是当我尝试该方法时,我得到了这样的结果: 因此,我切换回v-bind方法,但我得到的只是一个带有灰色边框的白色框-没有图像。但是,如果我在src属性上使用v-bind,我可以正确地看到图像。 我