奇怪的ArrayAdapter行为

时间:2010-12-21 01:50:25

标签: android android-arrayadapter

我正在为基于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);
            }
        });
    }
}

这非常有效。以下是它在现实世界中的样子(点击第3个图标后;这些项目只是占位符,但下载的文件是真实的):

[我无法发布图片(没有足够的代表),所以这里是一个链接]

http://i52.tinypic.com/20zb8jq.png

同时我可以开始第二次下载,它仍然可以完美运行。我也可以在最后添加元素,它也可以工作。但是,有一个小问题。每当我使用搜索按钮开始新活动并返回此活动时,相同的gridview将如下所示:

[我无法发布图片,只能发布一个超链接(代表不够),所以这里是一个带空格的链接]

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(),但它给出了完全相同的结果。 有谁知道什么可能导致这个问题?

感谢您的时间。

0 个答案:

没有答案