私はRecyclerViewで問題に遭遇し、皆さんが私を助けることができると思いました。そのため、問題は次のとおりです。アイテムビューのXMLの展開に時間がかかりすぎる。レイアウトは、3つのアイテムが並んだグリッドレイアウトで、各アイテムは複雑なUIの外観を持っています。
それで、最初にandroid studioのプロファイラーを使用してそれを分析しましたが、作成の時点でCPUに大きなバンプがあることがわかりました。バインドコード全体を削除しても、この画面に移動してリサイクラービュー内をスクロールすると、まだ時間がかかります。
アイテムを小さなアイテムに分離することは、既にマトリックス(私が言ったように、3つのアイテムが連続している)であるため、クレイジーになります。
だから私は2つのことを考えました:
多分私は前もってもっと多くのビューホルダーを作成することができます、それを行う方法はありますか?私はRecyclerView.setItemViewCacheSize
やなどのメソッドを見ましたLayoutManager.setInitialPrefetchItemCount
が、それを実現する運がありませんでした(それでもcreateを何度も呼び出しています)
AsyncLayoutInflaterについてはどうですか?誰かがRecyclerViewでそれを使用していますか?
どんな新しいアイデアも素晴らしいでしょう!
ビューxmlは次のようになります。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="3dp"
card_view:cardElevation="2.5dp"
card_view:cardUseCompatPadding="true">
<CustomView1>
</CustomView1>
<CustomView2>
</CustomView2>
<CustomView3>
</CustomView3>
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_gravity="end"
android:layout_marginEnd="2dp"
android:layout_marginStart="2dp"
android:layout_marginTop="2dp"
android:adjustViewBounds="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<include layout="@layout/someLayoutToInclude" />
</android.support.v7.widget.CardView>
</FrameLayout>
OnCreateViewHolderは次のようになります。
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(viewType, parent, false);
return new ItemViewHolder(view);
グリッドレイアウトの初期化:
final GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 3);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return 1;
}
});
ありがとう
これが私が最後に行った解決策です:先に述べたように、私の問題は、onCreateViewHolderが変更できない巨大な階層を持つ複雑なビューを作成することでした(製品単位)。
そのため、うまくいかなかったことが2つありました。
だから私がしたことは:
上で述べたように、AsyncLayoutInflaterがあります。これを使用するには、ダミーのViewGroupをインフレートする必要があり、その後、このダミーのビューに非同期インフレートビューを追加する必要がありました。もちろん、onBindViewHolderをサポートするためにいくつかの追加ロジックを実行する必要があります。
public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(R.layout.async_holder_item, parent, false);
AsyncLayoutInflater asyncLayoutInflater = new AsyncLayoutInflater(parent.getContext());
asyncLayoutInflater.inflate(viewType, (ViewGroup) view, new AsyncLayoutInflater.OnInflateFinishedListener() {
@Override
public void onInflateFinished(@NonNull View view, int resid, @Nullable ViewGroup parent) {
parent.addView(view);
}
});
return new ItemViewHolder(view, viewType);
}
ダミービューでちらつきまたは読み込み状態を使用して(レイアウトをシンプルに保つ!)、android:animateLayoutChanges = "true"をトップビューグループに追加して、スムーズにすることもできます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加