Два ViewHolders один адаптер - PullRequest
       18

Два ViewHolders один адаптер

1 голос
/ 29 сентября 2019

У меня есть два фрагмента с разными RecyclerViews, я сделал оба ViewHolders для фрагментов:

class RecyclerOneViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
    val title = itemView.list_tv
    val image = itemView.list_img
}

class RecyclerTwoViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
    val title = itemView.tv_card
    val image = itemView.iv_card
    val date = itemView.tv_card_date
}

И у меня есть адаптер, но только для первого ViewHolder. Могу ли я поделиться этим для обоих? Как?

class RecyclerAdapter(val movies: List<Movie>):
RecyclerView.Adapter<RecyclerOneViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerOneViewHolder {
    var itemView = LayoutInflater.from(parent.context).inflate(
        R.layout.layout_list, parent, false)
    return RecyclerOneViewHolder(itemView)
}

override fun getItemCount(): Int {
    return movies.size
}

override fun onBindViewHolder(holderOne: RecyclerOneViewHolder, position: Int) {
    holderOne.title.text = movies.get(position).title
    Picasso.get().load("https://image.tmdb.org/t/p/original"+movies.get(position).img)
        .into(holderOne.image)
}

override fun getItemViewType(position: Int): Int {
    return super.getItemViewType(position)
}

Ответы [ 3 ]

0 голосов
/ 30 сентября 2019

Я думаю, что вы спрашиваете, что у вас есть два RecyclerViews, два ViewHolder, один адаптер и используйте этот один адаптер для обоих RecyclerViews.

  • Сначала вам нужно создать общий ViewHolder и расширить его до другого. ViewHolders.
  • В классе адаптера должна быть переменная для распознавания типа держателя вида.
  • Это должно быть переменной конструктора.
class RecyclerAdapter(val movies: List<Movie>, val type: String):
        RecyclerView.Adapter<CommonViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CommonViewHolder{

        if(type.equals("type1"){
            var itemView = LayoutInflater.from(parent.context).inflate(R.layout.layout_list, parent, false)
            return RecyclerOneViewHolder(itemView)
        } else {
            var itemView = LayoutInflater.from(parent.context).inflate(R.layout.layout_list2, parent, false)
            return RecyclerTwoViewHolder(itemView)
        }
    }
}

Вынеобходимо проверить тип viewHolder в методе onBindViewHolder, потому что переменные отличаются

0 голосов
/ 30 сентября 2019

Вы можете добавить целочисленное свойство 'view type' к вашему Movie классу данных

    data class Movie(
        val title: String,
        val image: String,
        val date: String,
        val viewType: Int = 0
    )

, а затем к вашему getItemViewType вернуть тип представления из вашего класса данных Movie

override fun getItemViewType(position: Int): Int {
    val movie = getItemByPosition(position) as Movie
    return movie.viewType
}

на вашем onCreateViewHolder, вы можете использовать это для определения типа вашего представления

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder {
    when (viewType) {
        0 -> {
            val v = inflater.inflate(R.layout. layout_list, parent, false)
            return RecyclerOneViewHolder(v)
        }
        else -> {
            val v = inflater.inflate(R.layout. layout_list2, parent, false)
            return RecyclerTwoViewHolder(v)
        }
    }
}

, наконец, на вашем onBindViewHolder вы можете сделать это

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val position = holder.adapterPosition
        when (getItemViewType(position)) {
            0 -> {
                holder as RecyclerOneViewHolder
                // set view type 1 content here
            }
            else -> {
                holder as RecyclerTwoViewHolder
                // set view type 2 content here
            } 
    }
0 голосов
/ 30 сентября 2019

Вы должны изменить это:

class RecyclerAdapter(val movies: List<Movie>): RecyclerView.Adapter<RecyclerOneViewHolder>()

на это:

class RecyclerAdapter(val movies: List<Movie>): RecyclerView.Adapter<RecyclerView.ViewHolder>()

И вы можете преобразовать видоискатель в свои видоискатели, но вам нужно также реализовать метод getItemViewType().

...