Новое в 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
})
}
}
}
}
}
Как мне разрешить это исключение или есть лучший способ сделать это? Спасибо.