Как передать изменяемый список из фрагмента в другой фрагмент?

#android #kotlin #android-fragments

#Android #kotlin #android-фрагменты

Вопрос:

Я новичок в Kotlin и Fragments, на самом деле в моем приложении у меня есть два фрагмента: Fragment1 и Fragment2

В первом фрагменте у меня есть метод, который получает данные из некоторых EditTexts и добавляет их в изменяемый список, затем в моем Fragment2 у меня есть ListView, в котором я мог бы показать этот изменяемый список…

Но как я могу передать изменяемый список из фрагмента 1 во фрагмент2?

Вот мой код Fragment1:

  private var listArticoli: MutableList<Articolo>? = null
private fun addBarcode(barcode: String, qta: String) {
    if (barcode.isEmpty()) {
        txtBarcode.requestFocus()
        return;
    }

    listArticoli?.add(Articolo(barcode, qta.toInt()))

}

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

    txtBarcode = view.findViewById(R.id.txtBarcode)

    listArticoli = mutableListOf()


    btnArticoli.setOnClickListener {
        findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment) // button on click of which i navigate to Fragment2
    }
}
 

Фрагмент2 кода:

 class SecondFragment : Fragment() {

    lateinit var listView: ListView

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

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

        listView = view.findViewById(R.id.listView)

        view.findViewById<Button>(R.id.btnIndietro).setOnClickListener {
            findNavController().navigate(R.id.action_SecondFragment_to_FirstFragment)
        }
    }
}
 

Комментарии:

1. используйте safeargs для передачи данных между фрагментами, ознакомьтесь с официальными документами для получения дополнительной информации

Ответ №1:

1. Поделитесь viewmodel с их общей родительской активностью

2.FragmentResultListener из фрагмента (после 1.3.0-alpha04)

Ответ №2:

Чтобы получить доступ к изменяемому списку в обоих фрагментах, вы можете создать ViewModel, который состоит из MutableLiveDate требуемого вами типа данных.Затем предоставьте MutableLiveData из viewmodel.Поэтому используйте одну и ту же ViewModel в обоих фрагментах, устанавливая данные из одного фрагмента1 и просматривая данные из фрагмента2.

SampleViewModel.kt

 import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class SampleViewModel: ViewModel() {
    var mutableLiveData:MutableLiveData<MutableList<Articolo> = MutableLiveData()
 }
 

Fragment1.kt

 import android.os.Bundle 
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider

class Fragment1 : Fragment() {

private lateinit var viewModel: SampleViewModel
var arrayList: ArrayList<Articolo> = ArrayList()

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?,
): View? {
    return super.onCreateView(inflater, container, savedInstanceState)
}


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    viewModel = ViewModelProvider(requireActivity()).get(SampleViewModel::class.java)
    //TODO: Add data to arraylist
    viewModel.mutableLiveData.value = arrayList

}
 

}

Fragment2.kt

 import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider

class Fragment2 : Fragment() {

private lateinit var viewModel: SampleViewModel

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?,
): View? {

    return super.onCreateView(inflater, container, savedInstanceState)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    viewModel = ViewModelProvider(requireActivity()).get(SampleViewModel::class.java)
    viewModel.mutableLiveData.observe(viewLifecycleOwner, Observer {
      //TODO:Can do you requirements here
    })

}
 

}

Комментарии:

1. Привет, Тарун, не мог бы ты привести пример того, как я могу использовать MutableLiveData с массивом моего объекта Articolo?

2. Привет @KasperJuner В соответствии с запрошенным примером. Пожалуйста, проверьте, полезно ли это