Android Studio中Kotlin实现Fragment间动态列表显示问题求助
解决方案
1. 完善ViewModel(核心数据共享层)
首先需要实现一个带LiveData的ViewModel,用来存储和分发列表数据:
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel class MyViewModel : ViewModel() { // 用MutableLiveData保存列表数据,确保数据变化能通知到Fragment val itemList = MutableLiveData<MutableList<String>>(mutableListOf()) // 添加新项的方法 fun addItem(item: String) { val currentList = itemList.value ?: mutableListOf() currentList.add(item) itemList.postValue(currentList) } }
2. 修复FirstFragment的点击逻辑
补全按钮点击事件,将EditText的内容传入ViewModel:
class FirstFragment : Fragment() { private lateinit var viewModel: MyViewModel override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { viewModel = activity?.run { ViewModelProvider(this)[MyViewModel::class.java] } ?: throw Exception("Invalid Activity") val view = inflater.inflate(R.layout.one_fragment, container, false) val button = view.findViewById<Button>(R.id.vbutton) val editText = view.findViewById<EditText>(R.id.textView) button.setOnClickListener { val inputText = editText.text.toString().trim() if (inputText.isNotEmpty()) { viewModel.addItem(inputText) editText.text.clear() // 添加后清空输入框 } } return view } }
3. 修复SecondFragment的ListView显示逻辑
修正拼写错误(v改为view),并实现ListView的Adapter和数据观察:
import android.widget.ArrayAdapter import android.widget.ListView class SecondFragment : Fragment() { private lateinit var viewModel: MyViewModel private lateinit var listView: ListView private lateinit var adapter: ArrayAdapter<String> @SuppressLint("MissingInflatedId") override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { viewModel = activity?.run { ViewModelProvider(this)[MyViewModel::class.java] } ?: throw Exception("Invalid Activity") val view = inflater.inflate(R.layout.page3_fragment, container, false) // 替换成你布局中ListView的实际ID listView = view.findViewById<ListView>(R.id.listView) // 初始化列表适配器 adapter = ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, mutableListOf()) listView.adapter = adapter // 观察ViewModel的数据变化,实时更新列表 viewModel.itemList.observe(viewLifecycleOwner) { newList -> adapter.clear() adapter.addAll(newList) adapter.notifyDataSetChanged() } return view } }
关键注意点
- 确保SecondFragment布局中的ListView ID和代码中
findViewById的ID一致 - 使用
viewLifecycleOwner观察LiveData,避免Fragment销毁后出现内存泄漏 - 点击按钮时判断输入内容非空,防止添加无效空项
内容的提问来源于stack exchange,提问作者Kerr Anchor
相关产品推荐
相关产品推荐

