【发布时间】:2021-11-16 08:49:17
【问题描述】:
如果我有一个从视图模型观察数据以填充 recyclerview 列表的片段,如何处理 android 旋转屏幕?! 当旋转发生时,数据丢失了,那么如何使用 viewmodel 处理它,以便用户在旋转后感觉不到任何不同?
这是视图模型返回数据的部分:
private fun getImageList(keyWord: String) {
responseManager.loading()
val disposable = imageListUseCase.execute(keyWord, { success ->
responseManager.hideLoading()
_observeImageListData.value = Event(success)
}, { error ->
responseManager.failed(error)
})
compositeDisposable.add(disposable)
}
这里我在片段上设置了回收站数据:
更新
@AndroidEntryPoint
class ImagePickerFragment : Fragment() {
private lateinit var imagePickerBinding: FragmentImagePickerBinding
private val imagePickerViewModel: ImagePickerViewModel by activityViewModels()
private lateinit var imagePickerAdapter: ImagePickerAdapter
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
imagePickerBinding = FragmentImagePickerBinding.inflate(inflater, container, false)
observeImageList()
observeSearchText()
return imagePickerBinding.root
}
private fun observeImageList() {
imagePickerViewModel.observeImageListData.observe(
viewLifecycleOwner,
EventObserver { imageList ->
imagePickerAdapter = ImagePickerAdapter(imageList, imagePickerViewModel)
imagePickerBinding.apply {
rvImageList.setHasFixedSize(true)
rvImageList.layoutManager = GridLayoutManager(requireContext(),2)
rvImageList.adapter = imagePickerAdapter
}
})
}
有什么建议吗?
更新:
viewModel 从 BaseViewModel 扩展:
abstract class BaseViewModel: ViewModel() {
val compositeDisposable = CompositeDisposable()
override fun onCleared() {
super.onCleared()
compositeDisposable.clear()
}
}
这是完整的视图模型:
@HiltViewModel
class ImagePickerViewModel @Inject constructor(
private val imageListUseCase: ImageListUseCase,
private val responseManager: ResponseManager
) : BaseViewModel() {
private val _observeImageListData = MutableLiveData<Event<ArrayList<Image>>>()
init {
getImageList(Constants.KEY_WORD)
}
private fun getImageList(keyWord: String) {
responseManager.loading()
val disposable = imageListUseCase.execute(keyWord, { success ->
responseManager.hideLoading()
_observeImageListData.value = Event(success)
}, { error ->
responseManager.failed(error)
})
compositeDisposable.add(disposable)
}
fun filterSearchKeyWord(filteredKeyWord: String) {
if(filteredKeyWord.isNotEmpty())
getImageList(filteredKeyWord)
}
//getters:
val observeImageListData: LiveData<Event<ArrayList<Image>>>
get() = _observeImageListData
}
【问题讨论】:
-
这应该可以。我认为我们需要更多地了解您的 ViewModel 以了解它出了什么问题。
-
已更新,请查看
-
我仍然找不到错误。你能展示你在片段中实例化 ViewModel 的代码吗?
-
已更新,给您带来的不便,我深表歉意,感谢您的帮助:)
标签: android kotlin rotation landscape