【问题标题】:Handle android rotate screen处理android旋转屏幕
【发布时间】: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


【解决方案1】:

在您的清单中,尝试将其放入您的活动标签中:

android:configChanges="orientation"

所以它看起来像:

       <activity
        android:name=".MainActivity"
        android:configChanges="orientation"
        android:exported="true">

【讨论】:

  • 在官方文档中强烈建议不要使用此解决方案,因为它会让您手动修改任何需要重新加载其资源的视图。
猜你喜欢
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多