You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:05:14