Изменение сложных LiveData в RecyclerView - PullRequest
0 голосов
/ 11 февраля 2020

Новое в Android разработке и Kotlin.

Когда пользователь нажимает кнопку в элементе RecyclerView, я хочу изменить список, представляемый через LiveData. Сейчас я пытаюсь сделать это, фиксируя щелчок в onBindViewHolder и вызывая функцию во ViewModel, но это не работает, и я не думаю, что это правильно:

E / AndroidRuntime: Неустранимое исключение: main kotlin .KotlinNullPointerException в org ... adapters.PeopleViewAdapter $ onBindViewHolder $$ inlined $ apply $ lambda $ 2.onClick (PeopleViewAdapter.kt: 507) в android .view.View.performClick (Просмотреть. java: 6597) в android .view.View.performClickInternal (просмотр. java: 6574) в android .view.View.access $ 3100 (просмотр. java: 778) в android .view .View $ PerformClick.run (Просмотр. java: 25885) в android .os.Handler.handleCallback (Обработчик. java: 873) в android .os.Handler.dispatchMessage (Обработчик. java : 99) в android .os.Looper.l oop (Looper. java: 193) в android .app.ActivityThread.main (ActivityThread. java: 6669) в java .lang .reflect.Method.invoke (собственный метод) в com. android .internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit. java: 493) в com. android .internal.os.ZygoteInit.main ( ZygoteInit . java: 858)

Фрагмент

class PeopleFragment : Fragment() {
    //...

    private lateinit var viewModel: MainViewModel

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

        val binding = FragmentPeopleBinding.inflate(inflater, container, false)
        val context = context ?: return binding.root

        val factory = Utilities.provideMainViewModelFactory(context)
        viewModel = ViewModelProviders.of(requireActivity(), factory).get(MainViewModel::class.java)

        val adapter = PeopleViewAdapter()
        viewModel.people.observe(viewLifecycleOwner, Observer { data ->
            data?.let { adapter.submitList(data) }
        })

        binding.apply {
            mvm = viewModel
            lifecycleOwner = this@PeopleFragment
            rvPeopleDetails.adapter = adapter
        }

        return binding.root
    }

Класс данных помещения

data class PersonMessages(
        @Embedded
        val Person: Person,
        @Relation(
                parentColumn = "id",
                entityColumn = "person_id"
        )
        val Messages: List<Messages>
)

Адаптер RecyclerView

class PeopleViewAdapter: ListAdapter<PersonMessages, PeopleViewAdapter.ViewHolder>(PeopleDiffCallback()) {
//    ...
override fun onBindViewHolder(@NonNull holder: RecyclerView.ViewHolder, position: Int) {
        when (holder) {
            is PeopleViewHolder -> {
                holder.apply {
                    bind(getItem(position) as Person)
                    itemView.detail.setOnClickListener {
                        binding.mvm!!.showPersonMessages((position + 1).toLong())
                    }
                }
            }
            //...
        }
    }

ViewModel

class MainViewModel(private val repository: DataRepository) : ViewModel() {
    private val _people: LiveData<List<Any>>
    val people: LiveData<List<Any>>
        get() = _people

    init {
        _people = showPersonMessages(0)
    }

    fun showPersonMessages(id: Long): LiveData<List<Any>> {
        return Transformations.map(repository.livePeopleWithMessages()) { peopleWithMessages ->
            peopleWithMessages.flatMap {
                mutableListOf<Any>(it.Person).also { personWithMessages ->
                    personWithMessages.addAll(it.PersonMessages.filter {
                        it.personId == id
                    })
                }
            }
        }
    }
}

Как мне разрешить это исключение или есть лучший способ сделать это? Спасибо.

...