Android ベースのタブレット用のアプリケーションを作成しています。開発はかなり進んでいますが、理解できず、取り除けないバグが 1 つあります。カスタム ArrayAdapter を含む GridView があり、ダウンロード可能なアイテムがいくつか含まれています。このグリッドの各項目は、クリック可能な相対レイアウトで、次のようになります。
<RelativeLayout>
<FrameLayout />
<TextView />
<TextView />
<ProgressBar />
</RelativeLayout>
アイテムがクリックされると、アプリはそれを SD カードで見つけて表示しようとします。失敗した場合は、独自のスレッドでダウンロードを開始します。ファイルのダウンロード方法は非常に標準的ですが、次の 2 つの点が異なります。前述のように、独自のスレッドがあり、各データ チャンク (現時点では 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
同時に 2 回目のダウンロードを開始できますが、それでも問題なく動作します。最後に要素を追加することもできますが、それも機能します。ただし、少し問題があります。新しいアクティビティを開始する検索ボタンを使用してこのアクティビティに戻ると、同じグリッドビューは次のようになります。
[画像を投稿できず、ハイパーリンクが 1 つしかない (担当者が不足している) ため、ここにスペースを入れてリンクします]
http://i54.tinypic.com/16kqgxg.png
まだ正しい要素をダウンロードしていますが、間違ったプログレスバーが表示されるだけです。ダウンロード完了後も雑誌は表示されます。もう 1 つの望ましくない効果は、すべての項目が、ダウンロード中のものやプログレス バーがあるものも含めて、クリック可能に設定されていることです (私はダウンロードを開始する前に無効にしています)。アダプターを更新するコードは次のとおりです (少し短縮されていますが、問題ありません)。
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() を呼び出そうとしましたが、まったく同じ結果が得られました。この問題の原因を知っている人はいますか?
お時間をいただきありがとうございます。