問題タブ [android-paging-3]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - データがリフローしないように PagingData をキャッシュする方法
私は2つのフラグメントの簡単なセットアップを持っています:ConversationFragment
そしてDetailsFragment
とを使用Room
して、に属する と一緒に実装を使用しています。Paging 3 library
ConversationFragment
PagingLiveData
AndroidViewModel
ConversationFragment
ここでは使用していませんNavigation Components
。Android のドキュメントにある一般的なフラグメント ナビゲーションです。
そのフラグメントから を開き、DetailsFragment
再びフラグメントに戻ることができます。上記のフラグメントを開いて戻るまで、すべてがうまく機能していConversationFragment
ますDetailsFragment
.
これまでのところ、これは大きな問題ではありません。オブザーバーを再起動することができ、それを行うと機能します。ただし、オブザーバーを再度アタッチすると、リスト全体がリフローし、これによりアイテムが暴走し、RecyclerView
リストの位置が失われ、スクロールバーのサイズが変更され、ページがロード/リロードされていることが確認されます。
異様な振る舞いはある程度は耐えられたが、その上でポジションを失うのは許されない。
LiveData<PagingData<...>
ビューモデルで結果をキャッシュすることを検討しましたが、利用可能なドキュメントで見つけることができる例は基本的なものであり、オブジェクトを使用して同じことを達成する方法を示していません.
現在、これは私が持っているものです:
ConversationFragment
ConversationViewModel
そのまま結果をPagingLiveData.cachedIn
返しても、フラグメントに戻ったときの動作は同じです。recyclerview リストで項目が不規則な動作を示し、それがあった位置が完全に失われます。
これは、私の問題が解決したかどうかを確認するために達成しようとしていたものです。
これは、 https ://developer.android.com/codelabs/android-training-livedata-viewmodel#8 で利用できるコードラボです。
ご覧のmAllWords
とおり、キャッシュされ、ビューモデルが初めて構築されたときにのみ初期化されます。その後の変更は単純に更新され、新しいオブザーバーを接続する必要があるのは、フラグメントが破棄され、まだフラグメント内にある間に再度作成された場合のみです。バックスタック。
これは私がやろうとしていたことですが、思ったようには機能しません。少なくとも、思ったほど簡単ではありません。
これはどのように達成できますか?
android - Android Paging 3ライブラリ:新しいパラメータでリストを変更するには?
検索されたアイテムのリストを表示する検索フラグメントがあります。ユーザーが何かを入力すると、その文字列を新しいクエリ パラメータとして url に渡し、ページング 3 ライブラリを使用して新しいリストを取得します。
最初の解決策は次のとおりです。
url ( を変更することによるこのソリューションではshowPostList(newUrl)
、リストは変更されずに残ります。おそらく、viewModel でキャッシュされたリストを使用します。
別の解決策はshowPostList(initUrl)
、 in onViewCreated
of fragment を使用してから、パラメーターを変更してblewメソッドを使用することです。
これは機能しますが、古いリストと新しいリストに共通のアイテムがある場合、新しいリストは最後の共通の表示アイテムに表示されます。たとえば、古いリストの 5 番目の項目が新しいリストの 7 番目と同じ場合、リストを変更して新しいリストを表示すると、最初の項目ではなく 7 番目の項目から開始されます。
ここで別の解決策を見つけました:
ただし、このリストを使用すると、フラグメントに戻って更新され、Recyclerview
状態が変化することがあります。