我有一个包含GridView
的{{1}},如果图像成功下载并转换为ImageView
对象,我想刷新View
。 Bitmap
的适配器具有GridView
方法,可以设置默认图像或解码为getView
下载的图像(如果存在)。
要刷新GridView,我可以使用Bitmap
方法,因此我创建了一个myGridView.getAdapter().notifyDataSetChanged()
能够检测成功下载的文件是否是我需要的图像之一并最终发送{{1} } event到包含BroadcastReceiver
的活动以刷新它。由于GridView适配器甚至可以包含数千个元素,因此我希望仅在该特定文件的Listener
可见时才执行启动GridView
。
我想做这样的事情:
notifyDataSetChanged
但我有点担心:如果用户滚动GridView并且childView变为null或被View
中的下一项之一替换,该怎么办?有没有更安全的方法来做到这一点?
答案 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查看图像下载示例。