takasshii / APIPracticeApp

GithubAPIからランキング一覧を取得して表示するアプリです。
0 stars 1 forks source link

遷移後のFragmentの状態 #19

Closed shirataki707 closed 2 years ago

shirataki707 commented 2 years ago

リポジトリの詳細画面からランキング一覧に戻った際に,もともと表示されていたランキングが消えてしまいます. 更新ボタンを押した場合だけでなく,Fragmentが再生成されたときにもrecyclerViewにデータを表示させるイベントが必要なのか,そもそもFragmentの遷移時に前の画面を保持する処理を追加すべきなのかを考える必要がありそうです!

demo
takasshii commented 2 years ago
そもそも横画面対応がうまくいっていなかったみたいなのでViewModelからRecyclerViewのデータの渡し方を検討してみます。 demo
takasshii commented 2 years ago

RecyclerVIewに渡すItem型へ変換する処理を置く場所を間違えていました🙇

is Event.Success -> {
                        // 時間をセット
                        binding.timeText.text = event.time
                        // リストに値をセット
// ここにおくと、再生成時にこの処理が走らない(Success型を破棄するようにしているため)のでViewModel内でこの処理を行い、Item型をUIStateに保持させておくように変更します。
                        // Itemに変更
                        uiState.repositories?.items?.forEach {
                            tempItems.add(
                                Item(
                                    name = it.name,
                                    ownerIconUrl = it.owner.avatarUrl,
                                    language = it.language,
                                    stargazersCount = it.stargazersCount,
                                    watchersCount = it.watchersCount,
                                    forksCount = it.forksCount,
                                    openIssuesCount = it.openIssuesCount
                                )
                            )
                        }
                        adapter.submitList(tempItems)
                        // イベントを消費
                        viewModel.consumeEvent(event)
                    }
takasshii commented 2 years ago

Eventの外に置くことで再生成時に値がセットされるようになりました🙇

// LiveDataを監視
        viewModel.uiState.observe(viewLifecycleOwner) { uiState ->
            if(uiState.repositories != null) {
                // リストに値をセット ここ!!!!
                adapter.submitList(uiState.repositories)
            }
            if (uiState.events.firstOrNull() != null) {
                when (val event = uiState.events.firstOrNull()) {
                    is Event.Success -> {
                        // 時間をセット
                        binding.timeText.text = event.time
                        // イベントを消費
takasshii commented 2 years ago

修正完了しました!レビューお願いします!

shirataki707 commented 2 years ago

確認しました!マージしても大丈夫だと思います!