RomainGuyがGoogleI / Oセッション中にしばらく前に説明したように、リストビューの1つのビューのみを更新する最も効率的な方法は、次のようなものです(これはデータ全体を更新します)。View
ListView list = getListView();
int start = list.getFirstVisiblePosition();
for(int i=start, j=list.getLastVisiblePosition();i<=j;i++)
if(target==list.getItemAtPosition(i)){
View view = list.getChildAt(i-start);
list.getAdapter().getView(i, view, list);
break;
}
target
アダプターの1つのアイテムを想定しています。
このコードは、を取得し、現在表示されているビューを参照し、探しているアイテムを表示されている各ビューアイテムとListView
比較します。ターゲットがそれらの中にある場合は、囲んでいるビューを取得し、そのビューでアダプターを実行して表示を更新します。target
getView()
サイドノートinvalidate()
は一部の人が期待するようには機能せず、ビューを更新しないgetView()
ため、リスト全体が再構築され、表示されたすべてのアイテムがnotifyDataSetChanged()
呼び出され、多くのアイテムにも影響します。getview()
invalidateViews()
最後に、行ビューの子を変更するだけで、行全体を変更する必要がない場合は、パフォーマンスを向上させることもできますgetView
。その場合、次のコードを置き換えることができます(テキストlist.getAdapter().getView(i, view, list);
を変更する例)。TextView
((TextView)view.findViewById(R.id.myid)).setText("some new text");
コードでは、私たちは信頼しています。