Странное поведение ArrayAdapter - PullRequest
1 голос
/ 21 декабря 2010

Пишу приложение для планшетов на базе Android. Хотя я очень далеко продвинулся в разработке, есть одна ошибка, которую я не понимаю и от которой не могу избавиться. У меня есть GridView с пользовательским ArrayAdapter, который содержит некоторые загружаемые элементы в нем. Каждый элемент в этой сетке представляет собой относительный кликабельный макет, который выглядит примерно так:

<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

В то же время я могу начать вторую загрузку, и она все равно будет работать отлично. Я также могу добавить элементы в конце, и это тоже будет работать. Однако есть небольшая проблема. Всякий раз, когда я использую кнопку поиска, которая запускает новое действие, и возвращаюсь к этому действию, тот же самый вид сетки будет выглядеть следующим образом:

[Я не смог опубликовать изображение и только одну гиперссылку (недостаточно повторений), поэтому вот ссылка с пробелом]

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 (), но он дал точно такие же результаты. Кто-нибудь знает, что может вызвать эту проблему?

Спасибо за ваше время.

...