問題タブ [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.

0 投票する
1 に答える
821 参照

android - データがリフローしないように PagingData をキャッシュする方法

私は2つのフラグメントの簡単なセットアップを持っています:ConversationFragmentそしてDetailsFragment

とを使用Roomして、に属する と一緒に実装を使用しています。Paging 3 libraryConversationFragmentPagingLiveDataAndroidViewModelConversationFragment

ここでは使用していません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とおり、キャッシュされ、ビューモデルが初めて構築されたときにのみ初期化されます。その後の変更は単純に更新され、新しいオブザーバーを接続する必要があるのは、フラグメントが破棄され、まだフラグメント内にある間に再度作成された場合のみです。バックスタック。

これは私がやろうとしていたことですが、思ったようには機能しません。少なくとも、思ったほど簡単ではありません。

これはどのように達成できますか?

0 投票する
1 に答える
969 参照

android - Android Paging 3ライブラリ:新しいパラメータでリストを変更するには?

検索されたアイテムのリストを表示する検索フラグメントがあります。ユーザーが何かを入力すると、その文字列を新しいクエリ パラメータとして url に渡し、ページング 3 ライブラリを使用して新しいリストを取得します。

最初の解決策は次のとおりです。

url ( を変更することによるこのソリューションではshowPostList(newUrl)、リストは変更されずに残ります。おそらく、viewModel でキャッシュされたリストを使用します。

別の解決策はshowPostList(initUrl)、 in onViewCreatedof fragment を使用してから、パラメーターを変更してblewメソッドを使用することです。

これは機能しますが、古いリストと新しいリストに共通のアイテムがある場合、新しいリストは最後の共通の表示アイテムに表示されます。たとえば、古いリストの 5 番目の項目が新しいリストの 7 番目と同じ場合、リストを変更して新しいリストを表示すると、最初の項目ではなく 7 番目の項目から開始されます。

ここで別の解決策を見つけました:

ただし、このリストを使用すると、フラグメントに戻って更新され、Recyclerview状態が変化することがあります。