Как добавить ItemClick на PagedListAdapter? - PullRequest
0 голосов
/ 10 июля 2019

Я впервые применил концепцию MVVM к моему Android-приложению. Я следую инструкциям, указанным в статье

https://medium.com/swlh/realtime-firestore-pagination-on-android-with-mvvm-b5e30cea437

И мне удалось успешно загрузить данные. Когда дело доходит до реализации события onclick в строке моего списка RecyclerView, выясняется, что ответа onlick нет.

Не могли бы вы предложить лучший метод для реализации метода onCLick, учитывая, что я применил PageListAdapter?

Когда я изучаю документацию PageListAdapter на Android, мне кажется, что я не понимаю, как реализовать метод onclick.

class MovieViewModel(movieRepository: MovieRepository) : ViewModel() {
    private val viewModelJob = SupervisorJob()
    private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
    var selected: MutableLiveData<RealtimeMovie>? = null

    private val config = PagedList.Config.Builder()
            .setEnablePlaceholders(false)
            .setPrefetchDistance(10)
            .setPageSize(20)
            .build()

    val records: LiveData<PagedList<RealtimeMovie>> =
            LivePagedListBuilder<String, RealtimeMovie>(
                    MovieDataSource.Factory(movieRepository, uiScope),
                    config
            ).build()

    override fun onCleared() {
        super.onCleared()
        viewModelJob.cancel()
    }
}

Вот мой адаптер:

class MovieAdapter : PagedListAdapter<RealtimeMovie, MovieAdapter.MovieViewHolder>(
        object : DiffUtil.ItemCallback<RealtimeMovie>() {
            override fun areItemsTheSame(old: RealtimeMovie, new: RealtimeMovie): Boolean =
                    old.id == new.id

            override fun areContentsTheSame(old: RealtimeMovie, new: RealtimeMovie): Boolean =
                    old == new
        }
) {

    private lateinit var onItemClick: (movie: RealtimeMovie) -> Unit

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


    infix fun setOnItemClick(onClick: (movie: RealtimeMovie) -> Unit) {

        this.onItemClick = onClick
    }

    override fun onBindViewHolder(holder: MovieViewHolder, position: Int) {
        val record = getItem(position)
        holder.bind(record)
        holder.itemView.setOnClickListener { onItemClick(record!!) }
    }

    override fun onViewRecycled(holder: MovieViewHolder) {
        super.onViewRecycled(holder)
        holder.apply {
            txtRecordName.text = ""
            crdRecord.isEnabled = true
            crdRecord.setCardBackgroundColor(
                    ContextCompat.getColor(
                            view.context,
                            android.R.color.white
                    )
            )
            viewHolderDisposables.clear()
        }
    }

    inner class MovieViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
        val viewHolderDisposables = CompositeDisposable()

        val crdRecord by lazy { view.findViewById<MaterialCardView>(R.id.crd_record) }
        val txtRecordName by lazy { view.findViewById<TextView>(R.id.txt_record_name) }

        fun bind(RealtimeMovie: RealtimeMovie?) {
            RealtimeMovie?.let {
                it.record
                        .subscribeBy(
                                onNext = {
                                    txtRecordName.text = it.title

                                },
                                onError = {
                                    // Handle error here
                                    // Record maybe deleted
                                }
                        )
                        .addTo(viewHolderDisposables)
            }
        }
    }

}

Вот мой фрагмент: ..

viewModel = ViewModelProviders.of(this, factory).get(MovieViewModel::class.java)
viewModel.records.observe(this, Observer {
    swpRecords.isRefreshing = false
    recordsAdapter.submitList(it)
    recordsAdapter.setOnItemClick {
        print("movie : ${it.id}"   )
        print("movie : ${it.record}"   )
    }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...