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