web-dev-qa-db-ja.com

OnClickListenersが破棄されたときにRecyclerViewのViewHoldersから削除するにはどうすればよいですか?

私はアプリプロジェクトでRecyclerViewsを使用していて、(StackOverflow Q&A で言及されているようなコンストラクターで)ViewHoldersでOnClickListenersを設定しています。

次に、この質問があります:RecyclerViewのViewHoldersが破棄されたときにOnClickListenersを削除するにはどうすればよいですか

通常、次のようにしてOnClickListenerを削除できます。

view.setOnClickListener(null);

そして、それがViewPagerのPagerAdapterである場合、destroyItemメソッドでそれを行うことができます。

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    View view = container.findViewById(R.id.viewId);
    view.setOnClickListener(null);
}

RecyclerViewを使用してどこでできますか? -または、そうする必要はありませんか?

17
hata

ビューが画面から消えたときにRecyclerView.AdapterのビューのonCLickListener()をnullに設定したい場合は、 http://developer.Android.com/reference/Android/ recyclerViewのアダプターのsupport/v7/widget/RecyclerView.Adapter.html#onViewDetachedFromWindow(VH) 画面から消えたばかりのパラメーターとしてホルダーを受け取ります。そのホルダーで使用可能な任意のビューのonClickListenerをnullに設定できます。

または、画面に表示されたときに同じようにしたい場合は、onBindViewHolder()で行うことができます。ただし、リスナーの設定を回避できるため、これは意味がありません。

この回答に関連して覚えておくべきポイント:
すべてのデータセットに対して表示するようにクリックリスナーを設定するのではなく、少数に設定する場合は、リスナーをnullに設定することが必要になる場合があります。この場合、リスナーが画面から消えたときは常にnullに設定することをお勧めします。そうでない場合、RecyclerViewは、表示されている新しいデータセットを表すために削除されたホルダーオブジェクトを再利用(リサイクル)するためです。このプロセスでは、リスナーを設定しなかったデータセット(ホルダー内のビュー)は、リサイクルのためにリスナーセットを持っている可能性があります。

全体として、リサイクルによるスムーズなスクロールの利点を得ながら、ビュー(画像ビュー、テキストビューなどをクリアする)とonCLickListenerなどをnullに設定することは、開発者の責任です。

22
cgr

RecyclerViewを使用し、OnClickListenersをすべての行ルートビューにバインドしている場合、それらを破棄する必要はありません。

ただし、一部のビューがクリックイベントに応答しない場合は、setOnClickListener(null)を使用します。

2
michal.luszczuk