AndroidのListView
ウィジェットでは、は内部クラスのAdapterのメソッドListView
から取得したビューを保持します。getView
RecycleBin
のビューをクリアして、すべての子ビューをRecycleBin
強制的に再作成するにはどうすればよいですか。ListView
AndroidのListView
ウィジェットでは、は内部クラスのAdapterのメソッドListView
から取得したビューを保持します。getView
RecycleBin
のビューをクリアして、すべての子ビューをRecycleBin
強制的に再作成するにはどうすればよいですか。ListView
invalidate()またはinvalidateViews()を呼び出しても、(正解で述べたように)うまくいきませんでした。リサイクルされたビューは引き続きListViewに保存されていました。解決策を見つけるためにAndroidのソースコードを掘り下げる必要がありました。ListViewクラス(Android API 15 )のsetAdapter()メソッドを含む多くのメソッドをチェックしました:
@Override
public void setAdapter(ListAdapter adapter) {
// ...
mRecycler.clear();
// ...
}
お気づきのように、アダプターを設定すると、リストビューにすべてのリサイクルビューを保持しているリサイクラーがクリアされます。新しいアダプタを作成する必要はありません。同じアダプタを設定するだけで、リストビューのリサイクルビューリストをクリアできます。
Adapter adapter = listview.getAdapter ();
// ... Modify adapter ... do anything else you need to do
// To clear the recycled views list :
listview.setAdapter ( adapter );
私が正しく覚えていればinvalidate
、ListView
ウィジェットを呼び出すとViews
、現在保存されているキャッシュが空になります。ListView
パフォーマンスの問題が発生する可能性があるため、のビューのキャッシュを空にしないことをお勧めします。
アイテムを使用しない場合は、convertView
毎回行ビューを作成する必要があります(ユーザーがスクロールするたびに多くのオブジェクトが作成されます)+からのリサイクルビューによって占有される追加のメモリRecycleBin
とにかく使用されることはありません。
ListView
-には特別な方法がありますreclaimViews(List<View>)
。現在使用中およびごみ箱にあるすべてのアイテムを指定されたリストに移動します。Adapter
ウィジェットは、次回レンダリングする前に、アイテムの新しいビューを要求します。
アイテム構造に多くの変更がない場合は、再利用されたビューを使用するか、完全に廃棄することができます。たとえば、このメソッドを使用して、ユーザーが選択色を変更したときに、アイテムの背景描画可能を動的に更新しています。
ごみ箱のオブジェクトをArrayListまたはカスタムアダプタで使用したデータ構造から削除し、notifyDataSetChanged
アダプタのメソッドも呼び出します。
私の意見では、 @nekavallyが最良の解決策を提供します。私はとを持っていListView
ますSimpleCursorAdapter
。リストアイテムのサイズを変更する必要がある場合があります。ただし、アダプターはビューをリサイクルするため、ビューが間違った方法で表示される可能性があります。だから私はmListView.invalidateViews()
リサイクルされたビューを取り戻した後に電話をかけているだけで、それはうまく機能します。
startAnimation(initialHeight, finalHeight, duration, new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
childView.getLayoutParams().height =
(Integer) animation.getAnimatedValue();
childView.requestLayout();
if (animation.getAnimatedFraction() == 1f) {
mListView.reclaimViews(new ArrayList<View>());
mListView.invalidateViews();
}
}
});