我正在为基于 Android 的平板电脑编写应用程序。虽然我在开发方面已经走了很长一段路,但有一个我不理解也无法摆脱的错误。我有一个带有自定义 ArrayAdapter 的 GridView,其中包含一些可下载的项目。这个网格中的每个项目都是一个可点击的相对布局,看起来像这样:
<RelativeLayout>
<FrameLayout />
<TextView />
<TextView />
<ProgressBar />
</RelativeLayout>
单击某个项目时,应用程序将尝试在 sd 卡上找到它并显示它。如果失败,那么它将开始在它自己的线程中下载它。文件下载方法是非常标准的,除了两件事 - 它有,如前所述,它有自己的线程,并在下载每个数据块(此时为 2048 字节)后更新进度条:
while ((n = in.read(b,0,chunkSize)) >= 0) {
out.write(b,0,n);
if (handler != null && progressbar != null) {
/* Update progressbar:*/
currentBytes += n;
final int nbytes = currentBytes;
handler.post(new Runnable() {
public void run() {
progressbar.setProgress(nbytes);
}
});
}
}
这工作得很好。这是它在现实世界中的样子(点击第三个图标后;这些项目只是占位符,但下载的文件是真实的):
[我无法发布图片(没有足够的代表),所以这里有一个链接]
http://i52.tinypic.com/20zb8jq.png
同时我可以开始第二次下载,它仍然可以完美运行。我也可以在最后添加元素,它也会起作用。但是,有一个小问题。每当我使用启动新活动的搜索按钮并返回此活动时,相同的网格视图将如下所示:
[我无法发布图像并且只有一个超链接(没有足够的代表),所以这里是一个带空格的链接]
http://i54.tinypic.com/16kqgxg.png
它仍在下载正确的元素,只是显示了错误的进度条。下载完成后仍会显示该杂志。另一个不良影响是所有项目,即使是那些正在下载和带有进度条的项目,都设置为可点击(我在开始下载之前禁用它)。这是更新适配器的代码(有点缩短,但没关系):
List<Magazine> newList = cm.getMyMags(); // Returns a list of current magazines
List<Magazine> oldList = cachedAdapter.mags; // I use List.toArray() method in getView in Adapter.
for (Magazine mag : newList) {
if (!oldList.contains(mag)) {
cachedAdapter.add(mag);
}
}
我知道这不是最有效的方法,但现在我关心的只是让它发挥作用。
我试图更新列表本身并调用 notifyDataSetChanged(),但它给出了完全相同的结果。有谁知道什么可能导致这个问题?
感谢您的时间。