简体   繁体   中英

Two ViewHolders one Adapter

I have two fragments with different RecyclerViews , I made the both ViewHolders for the fragments:

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
}

And I have my adapter but for only the first ViewHolder . Can i share it for both? How?

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)
}

You should change this:

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

to this:

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

And you can cast the viewholder to your viewholders, but you need to implement getItemViewType() method too.

I think you are asking Your have two RecyclerViews, two ViewHolders, one Adaptor and use that one adaptor for both RecyclerViews.

  • First You have to create a common ViewHolder and extend it to your other ViewHolders.
  • There should be a variable in Adaptor Class to recognise type of the view holder.
  • That should pass as constructor variable.
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)
        }
    }
}

You need to check the type of viewHolder in onBindViewHolder method too because variables are different

You can add 'view type' integer property on your Movie data class

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

then on your getItemViewType return the view type from your Movie data class

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

on your onCreateViewHolder , you can use that to determine your view type

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)
        }
    }
}

lastly, on your onBindViewHolder you can do this

    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
            } 
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM