私はListViewのための真っ直ぐなBaseAdapterを持っています。 JSONフィードをダウンロードし、その行にデータを表示します。ビューを含むViewHolderと、 "Story"というデータオブジェクトがあります。すべてがうまく動作します。convertViewがリサイクルされるとListViewアダプタが混乱します
しかし、長いリストをスクロールした後、私は2つのことに気づきます。
1)私のログは、さらに下にスクロールすると、アダプタがフィードをリロードしていることを示しています。私はJSON配列全体を変数に入れてしまったので、なぜこれをリロードする必要があるのですか?これは奇妙です。
2)さらに重要なことは、前後にスクロールした後、行に間違った「ストーリー」オブジェクトが含まれていることです。 getViewルーチンの関連部分を次に示します。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
Story story = stories.get(position);
if (convertView == null) {
//create holder
holder = new ViewHolder();
convertView = inflator.inflate(R.layout.story_list_item, parent, false);
holder.titleView = (TextView) convertView.findViewById(R.id.story_list_title);
holder.dateView = (TextView) convertView.findViewById(R.id.story_list_date);
holder.story = story;
holder.imageView = (ImageView) convertView.findViewById(R.id.story_list_image);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// configure the view
holder.titleView.setText(story.title);
return convertView;
}
シンプルで十分です。奇妙なことは、if文if (convertView == null)
を削除することによって問題を解決できることです(行のリサイクルも排除していると思います)。
しかし、私はこのようにメモリの問題にぶつかりませんか?プレーンなバニラバージョンはなぜ機能しないのですか?
ありがとうございました。 よろしく、 S
JSONフィードがどこにダウンロードされているのかはわかりませんが、十分速くスクロールすると、最初のフィードのダウンロードが完了する前に再生される可能性があります。次に、2番目のフィードのダウンロードが開始され、最初にダウンロードが完了すると、最初のダウンロードが完了した時点で、それがある意味で「上書き」されます。 http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html – danh32
ありがとう、私は間違いなくそれを追求するでしょう。 – Mundi