Two ViewHolders one Adapter

Deadly 提交于 2019-12-24 15:22:25

问题


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

回答1:


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.




回答2:


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




回答3:


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


来源:https://stackoverflow.com/questions/58157666/two-viewholders-one-adapter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!