我使用 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
}
}
}}
如果有人需要这种情况的解决方案,我通过使用
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()
}
}
}
}