为什么删除或更改项目状态后无法加载新列表?

问题描述 投票:0回答:1

我使用 paging3 libary 通过分页从 api 获取数据。我得到它并在 onViewCreated 中成功加载。但是当使用时从列表中删除 api 项目。它无法将新列表加载到适配器。当我重新创建片段时,它显示成功。如何在

viewModel.stateDeleteMatch.observe
方法中也能做到这一点?我刚刚尝试了
likesAdapter?.notifyItemChanged(position)
likesAdapter?.notifyDataSetChanged
。另外,尝试调用
viewModel.getPaginationData()
方法。但这一切都行不通。

LikesFragment.kt

@AndroidEntryPoint
class LikesFragment : BaseFragment<FragmentLikesBinding>(
    bindingInflater = FragmentLikesBinding::inflate
) {
    private var likesAdapter: LikesAdapter? = null

    private val viewModel: LikesFragmentViewModel by viewModels()

    override fun onCreateFinished() {
        initLikesAdapter()
        viewModel.getPaginationData()
    }

override fun initObservers() {
        lifecycleScope.launch {
            viewModel.pagingData.collect { pagingData ->
                hideProgress()
                likesAdapter?.submitData(pagingData)
            }
        }
    viewModel.stateDeleteMatch.observe(viewLifecycleOwner) { state ->
            state?.let { result ->
                when (result.isLoading) {
                    false -> {
                        hideProgress()
                        if (result.error != "hata") {
                            result.deletePositionId?.let { position ->
                                //I need load adapter with new data here!!!
                                viewModel.getPaginationData()
                               // likesAdapter?.notifyItemChanged(position)
                            }
                        } else {
                            InfoBottomSheetDialog(
                                customMessage = getString(R.string.can_not_delete_now)
                            ).show(childFragmentManager, InfoBottomSheetDialog.TAG)
                        }

                    }

                    true -> showProgress()
                }
            }
        }
}
}

LikesFragmentViewModel.kt

@HiltViewModel
class LikesFragmentViewModel @Inject constructor(
    private val createUserAnswerUseCase: CreateUserAnswerUseCase,
    private val deleteMatchUseCase: DeleteMatchUseCase,
    private val likesPagingSource: LikesPagingSource
) : ViewModel() {
    var stateCreateUserAnswer = SingleLiveEvent<CreateUserAnswerState>()
        private set

    private val _pagingData = MutableStateFlow<PagingData<Likes>>(PagingData.empty())
    val pagingData: Flow<PagingData<Likes>> get() = _pagingData

    private var pageSize = 20

    private val pagingConfig = PagingConfig(
        pageSize = pageSize,
        enablePlaceholders = false
    )

    fun getPaginationData() {
        val pager = Pager(
            config = pagingConfig,
            pagingSourceFactory = { likesPagingSource }
        )

        // Observe the paging data and update the MutableStateFlow
        viewModelScope.launch {
            pager.flow.collectLatest { pagingData ->
                _pagingData.value = pagingData
            }
        }
    }}
android kotlin observer-pattern kotlin-flow android-paging-3
1个回答
0
投票

如果有人需要这种情况的解决方案,我通过使用

adapter.refresh
解决了它。

viewModel.stateDeleteMatch.observe(viewLifecycleOwner) { state ->
            state?.let { result ->
                when (result.isLoading) {
                    false -> {
                        hideProgress()
                        if (result.error != "hata") {
                            result.deletePositionId?.let { position ->
                               likesAdapter?.refresh
                            }
                        } else {
                            InfoBottomSheetDialog(
                                customMessage = getString(R.string.can_not_delete_now)
                            ).show(childFragmentManager, InfoBottomSheetDialog.TAG)
                        }

                    }

                    true -> showProgress()
                }
            }
        }
}
© www.soinside.com 2019 - 2024. All rights reserved.