视图被破坏后保留Int



我在片段中使用了一个网格布局,用户可以在其上切换每行显示的项目数量(通过按下按钮,他可以在6和4之间切换,但可能会在添加第三个选项时进行扩展(。

当用户离开片段(切换到另一个片段(并稍后返回时,我希望保留每行显示多少项目的信息。

在尝试了不同的选项后(savedInstanceState:不起作用,因为从未重新创建活动,getArguments:不是一个可行的选项,因为我必须多次传递信息(,我正在使用一个sharedViewModel,该模型在观察到一些信息时无论如何都会实现。

我觉得这太夸张了,因为它"只是"一个int(如果只有两个状态,甚至是一个bool(,而且可能有一个更简单的("内置"?(解决方案,它可能类似于活动的savedInstanceState。

这里有一些代码:

带有GridLayout的片段

class LibraryFragment : Fragment() {
private val model: SharedViewModel by activityViewModels()
private lateinit var gridlayoutManager: GridLayoutManager
private lateinit var thumbnailAdapter: ThumbnailAdapter
private lateinit var thumbnailRecyclerView: RecyclerView
private var booksPerLine = 4
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentLibraryViewerBinding.inflate(layoutInflater)
val view = libraryFragmentBinding.root
initRecyclerView()
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model.booksPerLine.observe(viewLifecycleOwner, Observer {
booksPerLine = it
switchNoOfBooksPerLine()
})
}
private fun initRecyclerView() {
thumbnailRecyclerView = libraryFragmentBinding.thumbnailRecyclerView
switchNoOfBooksPerLine()
thumbnailAdapter = ThumbnailAdapter { selectedBook: Book -> displaySelectedBook(selectedBook) }
thumbnailAdapter.setThumbnailList(listOf())
thumbnailRecyclerView.adapter = thumbnailAdapter
}
private fun switchNoOfBooksPerLine() {
gridlayoutManager = GridLayoutManager(requireContext(), booksPerLine, LinearLayoutManager.VERTICAL, false)
thumbnailRecyclerView.layoutManager = gridlayoutManager
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.change_grid -> {
when (booksPerLine) {
4 -> model.setBooksPerLine(6)
6 -> model.setBooksPerLine(4)
}
true
}
}
}
}

带有网格信息的SharedViewModel

class SharedViewModel : ViewModel() {
val booksPerLine = MutableLiveData<Int>()
internal fun setBooksPerLine(_booksPerLine: Int) {
booksPerLine.value = _booksPerLine
}
}
  • 所以问题是,是否有更简单/有效的方法来保留Int?(额外的问题是:SharedViewModel实际上有多高效(就内存等资源使用而言(?

  • 对于片段的活动,是否也有类似savedInstanceState的内置方法?

我建议将数据保留在活动中。并在片段中用类似的onViewCreated方法从活动中获取数据

val data = (activity as MyActivity)?.data

此外,当数据发生变化时,以另一种方式将数据放回活动中-

(activity as MyActivity)?.data = changedData

这是手动方式。请记住,数据是可以为null的。

最新更新