0

23.1.1から23.2.1へのサポートライブラリをいくつかのバグ修正のために更新する必要がありました。しかし、私はこの更新呼び出しの後にnotifyDataSetChange()が多くの時間を要し、UIをブロックしているという問題に遭遇しました。 10-20項目のような短いリストでは違いを気付くことはできませんが、400-500項目のリストではnotifyDataSetChange()は実行に2-3秒かかり、UIをブロックしています。 23.1.1では、どれくらいの時間がかかりませんでしたが、ユーザーエクスペリエンスの更新では、500〜600アイテムのリストでも瞬時に更新されました。23.1.1から23.2.1へのサポートライブラリ更新後のRecyclerViewアダプタのnotifyDataSetChange()の遅さ

コードに変更はありませんでした。サポートライブラリを23.1.1から23.2.1にアップグレードするだけです。

私は23.2.xxと23.3.xxと23.4.xxのライブラリを試しましたが、すべて同じ問題がありました。私は23バージョン

を使用する必要があるので、私は私がネットワークからmyItemListを受信したとき、私は非同期的に私の活動からアダプタを更新するサポートライブラリ24.xx.xxでそれをしようとしなかった。

... 
((MyRecyclerViewAdapter) mAdapter).updateList(myItemList); 
... 

アダプタでは、私はそれは遅延なしで仕事をしたと23.1.1でUIをブロックし、それが23.2.1以降でゆっくりしました上で、私が述べたように

public void updateList(List<MyItems> items) { 
    this.mDataset = items; 
    notifyDataSetChanged(); 
} 

を持っています。 RecylerViewのwrap_content機能が導入されたので23.2.1を使いたいです。

ご迷惑をおかけして申し訳ございません。

私のアダプタもあります

public void onBindViewHolder(final ViewHolder holder, int position) { 

    holder.itemName.setText(mDataset.get(position).getName()); 
    holder.itemPoints.setText(String.valueOf(mDataset.get(position).getPointsNumber())); 


} 

.... 

public static class ViewHolder extends RecyclerView.ViewHolder { 

    public final View mView; 
    TextView itemName; 
    TextView itemPoints;  

    public ViewHolder(View rowView) { 
     super(rowView); 
     itemName = (TextView) rowView.findViewById(R.id.item_name); 
     itemPoints = (TextView) rowView.findViewById(R.id.item_points); 

     mView = rowView; 
    } 
} 
+0

アダプタの表示方法を表示してください – Rahul

+0

アダプタはRecyclerView.Adapterを拡張していますので、getViewメソッドを使用していません。 – Tony

+0

次に、onBindViewHolder()を表示してください – Rahul

答えて

2

onBindViewHolder、ここで説明したように、1つはlayout_height =「0dp」を設定した場合、それはサポートライブラリ23.2+に、より高い状態として私の問題は、正確にRecyclerView 23.2.x height=0dp causes onBind called for all items and scrollToPosition not working

だったようです()はリスト内のすべての項目に対して同時に呼び出され、私の場合は400-600項目のリストではパフォーマンス上の問題が発生します。

ただし、ライブラリ23.3.0(またはそれ以上)をサポートするために上記のリンク先の推奨ソリューションとは反対に、この問題は解決しませんでした。

私はlayout_height = "0dp"の代わりにlayout_height = "1dp"を使用しましたが、なぜこの種のハックが動作するのかはまだ分かりません。または、layout_height = "0dp"が想定どおりに機能しない理由を具体的に説明してください。

+0

私はSDK 25.4.0で同じ問題が発生しています。 RecyclerViewの高さは "match_parent"に設定されていますが、layout_height = "0dp"のレイアウト内にあります。あなたが問題を解決することを示唆したように1dpに変更する。あなたはこれについてさらに詳しい情報を見つけましたか?ありがとう! – OferR

+0

いいえ、男性。回避策は私のために働いたので怠惰は再び勝ちました:)問題は24+ SDKでなくなったはずですが、そうではないようです。回避策の代わりに適切な解決策を見つけたら、ここに投稿してください。 – Tony

関連する問題