如何从另一个片段内部动态地将数据填充到回收器视图中?

How can I populate data into recycler view dynamically from inside of another fragment?

我对 android 开发还很陌生。 因此,我尝试通过将数据附加到现有数据列表中,通过另一个片段将数据添加到 recyclerview 中。我尝试在单击保存按钮时将数据添加到列表中,并将更改通知适配器。但它不起作用需要帮助。

dataSource.kt

class dataSource {
    var dataList = mutableListOf<RVData>(
        RVData("Jhon","An Accountant"),
        RVData("Alex","Doctor"),
        RVData("Jhon","An Accountant"),
        RVData("Alex","Doctor"),
        RVData("Jhon","An Accountant"),
        RVData("Alex","Doctor"),
    )
    fun loadData():List<RVData>{
        return dataList
    }
}

FirstFragment.kt

class FirstFragment : Fragment() {
    val data = dataSource().loadData()
    val adapter = RVAdapter(data)

    lateinit var navController:NavController

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_first, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val rView = view.findViewById<RecyclerView>(R.id.recyclerView)
        rView.adapter = adapter
        rView.layoutManager = LinearLayoutManager(activity)

        val addBtn = view.findViewById<Button>(R.id.materialButton)
        addBtn.setOnClickListener{
            toNextScreen(view)
        }
    }

    fun toNextScreen(view:View){
        navController = Navigation.findNavController(view)
        navController.navigate(R.id.action_firstFragment_to_secondFragment)
    }
}class FirstFragment : Fragment() {
    val data = dataSource().loadData()
    val adapter = RVAdapter(data)

    lateinit var navController:NavController

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_first, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val rView = view.findViewById<RecyclerView>(R.id.recyclerView)
        rView.adapter = adapter
        rView.layoutManager = LinearLayoutManager(activity)

        val addBtn = view.findViewById<Button>(R.id.materialButton)
        addBtn.setOnClickListener{
            toNextScreen(view)
        }
    }

    fun toNextScreen(view:View){
        navController = Navigation.findNavController(view)
        navController.navigate(R.id.action_firstFragment_to_secondFragment)
    }
}

RVAdapter.kt

class RVAdapter (
    var listItems:List<RVData>
    ):RecyclerView.Adapter<RVAdapter.RecyclerViewHolder>(){

    inner class RecyclerViewHolder(itemView: View):RecyclerView.ViewHolder(itemView){
        val itemName = itemView.findViewById<TextView>(R.id.tvName)
        val itemDesc = itemView.findViewById<TextView>(R.id.tvDesc)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.recycler_view_item,parent,false)
        return RecyclerViewHolder(view)
    }

    override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
        val dataItem = listItems[position]
        holder.apply{
            itemName.text = dataItem.name
            itemDesc.text = dataItem.description
        }
    }

    override fun getItemCount(): Int {
        return listItems.size
    }
}

SecondFragment.kt

class SecondFragment : Fragment() {
    lateinit var navController: NavController

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_second, container, false)
        val name = view.findViewById<EditText>(R.id.editText1)
        val desc = view.findViewById<EditText>(R.id.editText2)
        val btn = view.findViewById<Button>(R.id.materialButton2)
        btn.setOnClickListener{
            dataSource().dataList.add(
                RVData(name.text.toString(),desc.text.toString())
            )
            FirstFragment().adapter.notifyDataSetChanged()
            toNextScreen(view)
        }

        return view
    }

    fun toNextScreen(view:View){
        navController = Navigation.findNavController(view)
        navController.navigate(R.id.action_secondFragment_to_firstFragment)
    }
}
    btn.setOnClickListener{
        dataSource().dataList.add(
            RVData(name.text.toString(),desc.text.toString())
        )
        FirstFragment().adapter.list = dataSource().dataList; //or something like that.
        FirstFragment().adapter.notifyDataSetChanged()
        toNextScreen(view)
    }

您需要更新适配器内部列表,然后 notifyDataSetChanged()

将 dataList 放入伴随对象内的数据源模型中

class dataSource {

  companion object{

    var dataList = mutableListOf<RVData>(
        RVData("Jhon","An Accountant"),
        RVData("Alex","Doctor"),
        RVData("Jhon","An Accountant"),
        RVData("Alex","Doctor"),
        RVData("Jhon","An Accountant"),
        RVData("Alex","Doctor"),
      )
   }
   fun loadData():List<RVData>{
        return dataList
    }
}

在第二个片段中

dataSource.dataList.add(
                RVData(name.text.toString(),desc.text.toString())
            )

从第二个片段中删除此行

FirstFragment().adapter.notifyDataSetChanged()