Обмен данными между фрагментами с помощью liveata. но во втором фрагменте данные не соблюдаются - PullRequest
0 голосов
/ 14 марта 2020

Я использую liveata для обмена данными между двумя фрагментами. но данные во втором фрагменте вообще не наблюдаются, поэтому я не могу получить данные.

ViewModel

    var selectedAttachment = MutableLiveData<ArrayList<Attachment>>()
    private val attachmentList = ArrayList<Attachment>()

    private fun getExistingAttachmentPos(key: String): Int{
        return attachmentList.indexOfFirst { att -> att.name == key}
    }

    fun toggleAttachment(attachment: Attachment){
        val id = attachment.name
        val pos = getExistingAttachmentPos(id)
        if(pos == -1 ){
            attachmentList.add(attachment);
        }else{
            attachmentList.removeAt(pos);
        }
        selectedAttachment.postValue(attachmentList)
    }

Вскоре данные в первом фрагменте можно установить и наблюдать

первый фрагмент

    private fun observeHorizontalAttachment(){
        viewModel.selectedAttachment.observe(viewLifecycleOwner, Observer<ArrayList<Attachment>>{
            if(it.size>3){
                Log.d("tag63", it.toString())
                wrapPlus3.visibility = View.VISIBLE
                plus3.text = "+${(it.size - 3).toString()}"
                pendingAttachment.clear()
                pendingAttachment.addAll(it)
                (rvAttachment.adapter as AttachmentAdapter).setDataset(it)
            }else{
                pendingAttachment.clear()
                pendingAttachment.addAll(it)
                Log.d("tag3", "kurang dari 3 ${it.size}")
                wrapPlus3.visibility = View.GONE
            }
        })
    }

В первом фрагменте данные существуют / наблюдаемы

второй фрагмент

   private fun attachmentObserve(){
        viewModel.selectedAttachment.observe(viewLifecycleOwner, Observer<ArrayList<Attachment>>{
                Log.d("tag6",  it.toString())
                pendingAttachment.clear()
                pendingAttachment.addAll(it)
        })
    }

    private fun handleRvAttachment(){
        Log.d("tag61",  pendingAttachment.toString())
        rvListAttachment.apply {
            adapter = ListAttachmentAdapter(pendingAttachment)
            layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
        }
    }

Во втором фрагменте selectedAttachment вообще не наблюдает (даже 'tag6' не отлаживается), поэтому я не могу получить данные

Спасибо .

Ответы [ 2 ]

2 голосов
/ 14 марта 2020

SharedViewModel будет работать для вас в этом сценарии. Вы можете использовать как это:

FirstFragment и то же самое для SecondFragment

activity?.let {
        yourViewModel = ViewModelProvider(it).get(YourViewModel::class.java)

        yourViewModel.selectedAttachment.observe(viewLifecycleOwner, Observer<ArrayList<Attachment>> {
            Log.d("tag6", it.toString())
            pendingAttachment.clear()
            pendingAttachment.addAll(it)
        })
    }

Где на activity это можно использовать следующим образом, если вы наблюдаете на activity

viewModel = ViewModelProvider(this).get(YourViewModel::class.java)

Существует также прямая замена ViewModelProvider(this) на by activityViewModels() и может быть реализована как this

0 голосов
/ 14 марта 2020

Я изменил метод объявления для объявления модели представления с private val viewModel: ChatListViewModel by inject() на private val viewModel: ChatListViewModel by sharedViewModel<ChatListViewModel>()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...