在Android中使用共享ViewModel将新项目插入到选定的子列表中,可以按照以下步骤进行操作:
class SharedViewModel : ViewModel() {
val itemList = MutableLiveData>()
fun addItem(item: Item) {
val items = itemList.value?.toMutableList() ?: mutableListOf()
items.add(item)
itemList.value = items
}
}
class MainFragment : Fragment() {
private lateinit var sharedViewModel: SharedViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
// 初始化视图
val view = inflater.inflate(R.layout.fragment_main, container, false)
// 获取SharedViewModel实例
sharedViewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)
// 设置主列表适配器
val mainListAdapter = MainListAdapter { selectedCategory ->
// 在用户选择子列表项时将新项目插入到选定的子列表中
val newItem = Item("New Item")
val selectedItems = sharedViewModel.itemList.value?.toMutableList() ?: mutableListOf()
selectedItems.add(newItem)
sharedViewModel.itemList.value = selectedItems
}
view.findViewById(R.id.mainList).apply {
adapter = mainListAdapter
layoutManager = LinearLayoutManager(requireContext())
}
// 观察共享的itemList数据并更新列表
sharedViewModel.itemList.observe(viewLifecycleOwner, Observer { itemList ->
mainListAdapter.submitList(itemList)
})
return view
}
}
class MainListAdapter(private val onItemClick: (String) -> Unit) : ListAdapter(CategoryDiffCallback()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_category, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val category = getItem(position)
holder.bind(category)
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(category: Category) {
itemView.setOnClickListener {
onItemClick(category.name)
}
// 绑定子列表项的其他视图
}
}
// DiffUtil用于计算列表差异
class CategoryDiffCallback : DiffUtil.ItemCallback() {
override fun areItemsTheSame(oldItem: Category, newItem: Category): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: Category, newItem: Category): Boolean {
return oldItem == newItem
}
}
}
以上是在Android中使用共享ViewModel将新项目插入到选定的子列表中的解决方法。可以根据实际需求进行相应的修改和扩展。
上一篇:Android [Google ML Kit] 异常:java.lang.UnsatisfiedLinkError: dlopen 失败
下一篇:Android [LocationManager] 的 requestLocationUpdates() 方法引发了 java.lang.RuntimeException。