15

AndroidのListViewウィジェットでは、は内部クラスのAdapterのメソッドListViewから取得したビューを保持します。getViewRecycleBin

のビューをクリアして、すべての子ビューをRecycleBin強制的に再作成するにはどうすればよいですか。ListView

4

5 に答える 5

43

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 );
于 2013-04-28T09:43:38.553 に答える
4

私が正しく覚えていればinvalidateListViewウィジェットを呼び出すとViews、現在保存されているキャッシュが空になります。ListViewパフォーマンスの問題が発生する可能性があるため、のビューのキャッシュを空にしないことをお勧めします。

アイテムを使用しない場合は、convertView毎回行ビューを作成する必要があります(ユーザーがスクロールするたびに多くのオブジェクトが作成されます)+からのリサイクルビューによって占有される追加のメモリRecycleBinとにかく使用されることはありません。

于 2012-08-21T07:14:45.337 に答える
2

ListView-には特別な方法がありますreclaimViews(List<View>)。現在使用中およびごみ箱にあるすべてのアイテムを指定されたリストに移動します。Adapterウィジェットは、次回レンダリングする前に、アイテムの新しいビューを要求します。

アイテム構造に多くの変更がない場合は、再利用されたビューを使用するか、完全に廃棄することができます。たとえば、このメソッドを使用して、ユーザーが選択色を変更したときに、アイテムの背景描画可能を動的に更新しています。

于 2015-01-15T08:20:06.403 に答える
0

ごみ箱のオブジェクトをArrayListまたはカスタムアダプタで使用したデータ構造から削除し、notifyDataSetChangedアダプタのメソッドも呼び出します。

于 2012-08-21T06:22:20.513 に答える
0

私の意見では、 @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();
                        }
                    }
                });
于 2018-02-08T14:59:25.947 に答える