有效地更新GridView子视图

时间:2014-02-09 12:47:08

标签: java android android-gridview android-broadcast

我有一个包含GridView的{​​{1}},如果图像成功下载并转换为ImageView对象,我想刷新ViewBitmap的适配器具有GridView方法,可以设置默认图像或解码为getView下载的图像(如果存在)。

要刷新GridView,我可以使用Bitmap方法,因此我创建了一个myGridView.getAdapter().notifyDataSetChanged()能够检测成功下载的文件是否是我需要的图像之一并最终发送{{1} } event到包含BroadcastReceiver的活动以刷新它。由于GridView适配器甚至可以包含数千个元素,因此我希望仅在该特定文件的Listener可见时才执行启动GridView

我想做这样的事情:

notifyDataSetChanged

但我有点担心:如果用户滚动GridView并且childView变为null或被View中的下一项之一替换,该怎么办?有没有更安全的方法来做到这一点?

2 个答案:

答案 0 :(得分:3)

我个人认为你不应该和ListView / GridView孩子一起玩(除非你真的需要)。如果您的数据已更改,请致电notifyDataSetChanged()ListView / GridView会重新绘制一些项目(可见的项目),即使您有数千项。

要优化代码并仅在项目可见时致电notifyDataSetChanged(),您可以致电getFirstVisiblePosition()getLastVisiblePosition()

获取第一个和最后一个可见位置

答案 1 :(得分:1)

我猜测您的Activity使用AsyncTask下载图像,然后使用Adapter getView()方法对其进行解码。如果您的应用的用户上下滑动过快,那么您的图片可能会变得模糊/交换,并且您的应用可能会变得无法响应,因为AsyncTask线程会疯狂地尝试应对下载和放大缓存和Adapter解码的困难。

您是否听说过适用于Android的新Volley网络库?它是在谷歌(它是AOSP的一部分)开发的。我建议你试一试,因为它默认是异步的(它抽象了下载,缓存和解码,同时为开发人员提供了一个非常干净的界面)。我将它用于HTTP请求&图像下载,它非常快速和稳定。你甚至可以控制线程优先级&消除。列表视图/网格视图没有模糊或卡顿,它可以轻松处理非常大的图像。毕加索是图像下载部分的另一个很好的选择。 Picasso下载图像的速度比Volley略慢,但它的稳定性和 TRIVIAL 可以整合(适配器中的一行代码)。

即使你没有将notifyDatasetChanged()方法添加到Adapter getView()中,Volley和Picasso也能很好地工作(尽管当然这是一个很好的做法这样做)。由于getView()方法是按需调用的,因此只有在用户向下滚动时才下载图像。

使用Volley here查看图像下载示例。