【发布时间】:2020-07-20 07:10:48
【问题描述】:
我在片段中使用网格布局,用户可以在该片段上切换每行显示的项目数量(通过按下按钮,他当前可以在 6 和 4 之间切换,但可能会在添加第三个选项时扩展)。
当用户离开片段(切换到另一个片段)并稍后返回时,我想保留每行显示多少个项目的信息。
在尝试了不同的选项之后(savedInstanceState:不起作用,因为永远不会重新创建活动,getArguments:不是一个可行的选项 afaik,因为我必须多次传递信息)我正在使用一个 sharedViewModel 无论如何实现为观察到一些信息。
我觉得这有点矫枉过正,因为它“只是”一个 int(如果只有 2 个状态,甚至是一个 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 这样的内置方法用于片段的活动?
【问题讨论】:
-
这看起来不错。你有什么问题?
-
啊,对不起。我想知道,这是否是一种矫枉过正,特别是如果有一个更简单或更有效的方法的内置方法。我会编辑帖子
-
我会这样做。不知道有什么更好的方法。有一些更简单快捷的方法,例如将值存储在单例成员变量中。
标签: android kotlin fragment android-gridlayout