2016-03-30 13 views
10

私はas seen in this tutorialの異種のビューでRecyclerViewを使用しています。RecyclerViewで一部のアイテムをリサイクルしないようにしたい

私はRecyclerView内にRecyclerViewもあるアイテムをいくつか持っています。想像するのはあまりにも難しいですか? Playストアのレイアウトをコピーしたいとしましょう:垂直リニアレイアウトの1つの大きなRecyclerViewで、多くの要素で満たされた単一のアプリとアプリのカルーセル。

追加するアイテムが1つのアプリケーションのレイアウトの場合は、ID1が使用され、1つのアイテムのレイアウトが追加されます。 それ以外の場合は、カルーセルを追加する必要がある場合は、1つの要素をメインのRecyclerViewに追加します。別のRecyclerViewには独自のアダプタが追加されます。

これはうまく機能します。メインRecyclerViewをスクロールする場合を除きます。どうして? onBindViewHolder()メソッドで表示されなくなったときに一部のビューが破棄されているためです。なぜここに?メインのRecyclerViewのアダプタがXの位置を通過してからOnBindViewHolder()を呼び出しているためです。後者は、独自のアダプタを備えた新しいRecyclerViewを作成し、それをそれに割り当てます。私はいつも再膨張するために重いので、それらの意見を保ちたいと思います。

これは可能ですか?もしそうなら、あなたはどのように教えてくれますか?

答えて

33

使用この:これは、ビュータイプTYPE_CAROUSELの任意のビューをリサイクルしませんが、このタイプのアイテム数が非常に高い場合、それは大幅にパフォーマンスが低下します

recyclerView.getRecycledViewPool().setMaxRecycledViews(TYPE_CAROUSEL, 0); 

は、多分

OOMEsを引き起こします

EDIT

MML13の答えを読んだ後、私はそれがあなたのために働くかもしれないと思います。そのビューが外部のRecyclerViewで再バインドされるときに、カルーセルのアイテムが再膨張してしまうことに心配しています。これらのカルーセルのタイプがすべて同じ(つまり、同じアダプタを使用している場合)の場合、アダプタをRecyclerViewのViewHolderの外側に置いて、データを交換して、再バインドするときにまたはnotifyItemRangeChanged(...)を呼び出します。これにより、すべてのカルーセルビューと、そのカルーセル内のすべてのビューがリサイクルされます。

+0

それは私のためにうまくいきます! –

+0

'int viewType'パラメータに渡されるデフォルト値は何ですか?私はそれのための任意のドキュメントを見つけるcouldnt? – Sanoop

+2

@Sanoop 'getItemViewType'を上書きしない限り、デフォルトのviewTypeは' 0'です([this](https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v7/recyclerviewを参照)。 /src/android/support/v7/widget/RecyclerView.java#5818)) – Sourabh

7

onBindViewHolder()メソッドで再現する際もはや目に見えるし、次いで いくつかのビューが破壊されるからです。

これは本当ではありません。再作成されず、再バインドされます。あなたが位置X(スクラップやリサイクル業者)のビューを持っている場合、RecyclerViewはそれを使用して再バインドします。

私はこれらのビューを毎回再膨張するのが重いのでそのままにしておきたいと思います。

メインRecyclerViewはそれらを保持します。 2番目のRecyclerViewのアダプタデータを変更し、notifyDataSetChangedに電話するだけです。もう1台のRecyclerViewアダプタをRecyclerViewviewHolderの内部に保存してください。

+1

私の日+1を保存します。 – Bawa

0

からの基準をとっているrecyclerView.getRecycledViewPool().setMaxRecycledViews(1,0);

RecyclerViewAdapterクラスにコードの下に設定

@Override 
    public int getItemViewType(int position) { 
     return 1; 
    } 
関連する問題