2011-11-15 11 views
4

私はBaseAdapterによって供給されるリストビューを持っています。Listview + BaseAdapter - 単一項目の変更についての通知方法?

何かデータが変更されると、私はBaseAdapter.notifyDataSetChangedを呼び出します。すべて正常に動作します。

私はいくつかのリスト項目の細かいディテールを変更した場合、画面上に表示されている単一項目のビューを更新する最適化された方法がありますか? notifyDataSetChangedは、リスト内のすべての表示可能なアイテムのビューを盲目的に再構築するとします。これは、アイテムの変化が軽微であれば最適ではありません。

答えて

0

はい、方法はあります。たとえば、View.setTagに値を代入してリストアイテムを識別できるとすると、リストアイテムを反復処理し、必要に応じてリストアイテムを1つだけ再バインドしたり、アイテムの一部のサブビューのみを更新したりすることができます。

それは(線形検索)シンプルかつ比較的安価です:

のMyIDは私が更新したい項目のいくつかのIDで、updateListItemは、リスト項目に所望の変更を行う
for(int i = list.getChildCount(); --i>=0;){ 
    View v = list.getChildAt(i); 
    Object id = v.getTag(); 
    if(id==myId){ 
     updateListItem(id, v); 
     break; 
    } 
} 

。証明され、うまく動作し、非常に効率的です。

1

いいえ、あなた自身のListViewクラス拡張を実装しない限り、それはできないと思います。 setAdapter()にはsource codeがあります。

あなたが表示されます、ListViewmAdapter.registerDataSetObserver(mDataSetObserver); を使用してオブザーバーとして自身を登録し、DataSetObserverは、特定の位置の変化を通知する手段を提供していません。

私が知る限り、ListViewは現在画面に表示されているアイテムのみをレンダリングして更新するので、ここでの最適化は必要ありません。そのため、特定のアイテムの更新について通知する必要はありません。

関連する問題