製品リストフラグメントと他の多くのフラグメントを含むアクティビティがあり、アーキテクチャコンポーネントのナビゲーションコントローラーを使用しようとしています。
問題は、(開始宛先)製品リストのフラグメントを置き換え、ユーザーが[戻る]ボタンをクリックしたときにリストがリロードされないようにすることです。
置換ではなく追加としてフラグメントトランザクションを作成する方法。
add
およびフラグメントトランザクションのその他のオプションを待機しているときに同じ問題に直面しました。
バインディングが存在するかどうかのチェックを追加し、ネットワークコールと同じように以前の状態を復元するだけです。ビューモデルにデータが存在するかどうかのチェックを追加し、ネットワークの再フェッチを実行しません。テスト後、期待どおりに動作します。
[〜#〜] edit [〜#〜]:リサイクルビューでは、フラグメントから移動する前のリストと同じ状態に自動的に戻ると思いますが、onSavedInstanceSate
も可能です
private lateinit var binding: FragmentSearchResultsBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
viewModel =
ViewModelProviders.of(this, mViewModelFactory).get(SearchResultsViewModel::class.Java)
return if (::binding.isInitialized) {
binding.root
} else {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_search_results, container, false)
with(binding) {
//some stuff
root
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//reload only if search results are empty
if (viewModel.searchResults.isEmpty()) {
args.searchKey.let {
binding.toolbarHome.title = it
viewModel.onSearchResultRequest(it)
}
}
}
少し検索した後は不可能ですが、問題自体はviewmodelとlivedataまたはrxjavaで解決できます。そのため、トランザクションの後でフラグメントの状態が保持され、製品リストが毎回リロードされません
@Rainmakerは私の意見では正しいです、私は同じことをしました。リストフラグメントに戻ったときに同じリサイクラービューの位置に戻るために、リサイクラービューの位置/状態をonSaveInstanceStateに保存することもできます。