问题
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