2

リストビューとそのアダプターについて多くの質問がありますが、私はそれを正しく使用していると確信しています。ただし、Android 4.0.3 (ICS、および一部の特定のレイアウトでのみ) で (常に) 適切に更新されないリストビューがあります。

コード:

アクティビティの onCreate で:

mListView = (ListView) findViewById( R.id.list);
mArrayAdapter = new CustomListAdapter( this, R.layout.row_layout);
// We update it manually, but leaving this default doesn't work either
mArrayAdapter.setNotifyOnChange( false);
mListView.setAdapter( mArrayAdapter);

別のスレッドから、アダプターに追加、置換、挿入する必要がある新しいデータを受け取ります。簡単に言うと、クリアを使用して総置換の例を使用します。

private void updateList() {
  runOnUiThread(new Runnable() {
    public void run() {
      mArrayAdapter.clear();
      for (CustomItem item: mLastReceivedItems) {
        mArrayAdapter.add(item);
      }
      mArrayAdapter.notifyDataSetChanged();
    }
  });
}

新しいアイテムが受信されると、リストに表示されますが、アイテムなしで更新が受信されると表示されます。アダプターが実際に空である間、ビューはまだアイテムを表示しています。

コードは引き続き Android 2.3.7 で動作し、他のレイアウトを使用しても再現できませんが、問題になる可能性のある多くの違いは見られません。

パフォーマンスをあまり落とさずにこのバグを回避するためのレイアウト パラメータまたはアダプタ関数を見つけた人はいますか?

4

1 に答える 1

1

データを更新するたびにリストビューに同じアダプターを設定して、リストビューがすべての「SMART」ビューを再利用して削除するようにすることで、一時的な修正として回避策を見つけました。

private void updateList() {
  runOnUiThread(new Runnable() {
    public void run() {
      mArrayAdapter.clear();
      for (CustomItem item: mLastReceivedItems) {
        mArrayAdapter.add(item);
      }
      mArrayAdapter.notifyDataSetChanged();
      // FIXME: Temp fix for ICS:
      mListView.setAdapter( mListView.getAdapter());
    }
  });
}

このように ListView.mRecycler を使用していないため、ここでパフォーマンスが低下しているため、誰かが問題の場所を知っていることを願っています。

于 2012-09-06T06:30:28.183 に答える