英文:
using viewtype , onBindViewHolder and onCreateViewHolder are different
问题
我正在使用RecyclerView中的ViewType进行研究。
我使用了两种ViewType。当我测试更改ViewType时,没有发生变化。
我插入了ViewType1,但结果返回到ViewType0。
日志如下所示:
D/TAG: ProfileViewHolder onCreateViewHolder
D/TAG: ItemViewHolder onBindViewHolder
onCreateViewHolder是正确的,但ItemViewHolder不正确。彼此不同。
我应该如何修复?以下是我的代码。
class RecyclerViewAdapter(private val context: Context, private val items: ArrayList<DetailModel>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is ProfileViewHolder) {
holder.name.text = items[position].login
Glide.with(context)
.load(items[position].profileImage)
.centerCrop()
.override(200, 200)
.error(R.drawable.image_not_found)
.into(holder.profileImage)
Log.d("TAG", "ProfileViewHolder onBindViewHolder")
} else if (holder is ItemViewHolder) {
holder.name.text = items[position].name
holder.description.text = items[position].description
holder.stargazersCount.text = items[position].stargazersCount.toString()
Log.d("TAG", "ItemViewHolder onBindViewHolder")
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
if (viewType == 0) {
val inflatedView: View = LayoutInflater.from(parent.context)
.inflate(R.layout.detail_item, parent, false)
Log.d("TAG", "ProfileViewHolder onCreateViewHolder")
return ItemViewHolder(inflatedView)
} else {
val inflatedView: View = LayoutInflater.from(parent.context)
.inflate(R.layout.profile_item, parent, false)
Log.d("TAG", "ItemViewHolder onCreateViewHolder")
return ProfileViewHolder(inflatedView)
}
}
override fun getItemCount() = items.size
override fun getItemId(position: Int): Long {
return items[position].id.toLong()
}
class ItemViewHolder(v: View) : RecyclerView.ViewHolder(v) {
val name: TextView = itemView.findViewById(R.id.name)
val description: TextView = itemView.findViewById(R.id.description)
val stargazersCount: TextView = itemView.findViewById(R.id.stargazersCount)
}
class ProfileViewHolder(v: View) : RecyclerView.ViewHolder(v) {
val name: TextView = itemView.findViewById(R.id.login)
val profileImage: ImageView = itemView.findViewById(R.id.profileImage)
}
}
// 在 onCreate 中
var detail = DetailModel()
detail.login = userId
detail.viewType = 1
itemList.add(detail)
setAdapter()
希望这能帮助你解决问题。如果还有其他问题,请随时提出。
英文:
I'm studying using viewtype in recyclerview.
I use two viewtypes. when I tested for changing viewtype, there is no change.
I inserted viewtype1 but the result is returned to viewtype0.
the log is like below D/TAG: ProfileViewHolder onCreateViewHolder
D/TAG: ItemViewHolder onBindViewHolder
onCreateViewHolder is right, but the ItemViewHolder is not right. each other different.
what should I fix? here is my code.
class RecyclerViewAdapter(private val context: Context, private val items : ArrayList<DetailModel>) : RecyclerView.Adapter<RecyclerView.ViewHolder>(){
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if(holder is ProfileViewHolder) {
holder.name.text = items[position].login
Glide.with(context)
.load(items[position].profileImage)
.centerCrop()
.override(200,200)
.error(R.drawable.image_not_found)
.into(holder.profileImage)
Log.d("TAG","ProfileViewHolder onBindViewHolder")
}else if(holder is ItemViewHolder){
holder.name.text = items[position].name
holder.description.text = items[position].description
holder.stargazersCount.text = items[position].stargazersCount.toString()
Log.d("TAG","ItemViewHolder onBindViewHolder")
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
if(viewType == 0) {
val inflatedView: View = LayoutInflater.from(parent.context)
.inflate(R.layout.detail_item, parent, false)
Log.d("TAG","ProfileViewHolder onCreateViewHolder")
return ItemViewHolder(inflatedView)
}
else {
val inflatedView: View = LayoutInflater.from(parent.context)
.inflate(R.layout.profile_item, parent, false)
Log.d("TAG","ItemViewHolder onCreateViewHolder")
return ProfileViewHolder(inflatedView)
}
}
override fun getItemCount()=items.size
override fun getItemId(position: Int): Long {
return items.get(position).id.toLong()
}
class ItemViewHolder(v: View) : RecyclerView.ViewHolder(v) {
val name :TextView = itemView.findViewById(R.id.name)
val description : TextView = itemView.findViewById(R.id.description)
val stargazersCount :TextView = itemView.findViewById(R.id.stargazersCount)
}
class ProfileViewHolder(v: View) : RecyclerView.ViewHolder(v) {
val name :TextView = itemView.findViewById(R.id.login)
val profileImage : ImageView = itemView.findViewById(R.id.profileImage)
}
}
OnCreate
var detail = DetailModel()
detail.login= userId
detail.viewType=1
itemList.add(detail)
setAdapter()
答案1
得分: 2
onCreateViewHolder 中的 viewType 是由 RecyclerView.Adapter 返回的,为了为每个位置分配 viewType 给这个适配器,您需要重写 getItemViewType。
在您的情况下,可以这样做。
override fun getItemViewType(position: Int): Int {
val detail = items[position]
return detail.viewType
}
英文:
viewType in onCreateViewHolder is returned by RecyclerView.Adapter, To assign viewType to this adapter for each position, you need to override getItemViewType.
In your case it might be like this.
override fun getItemViewType(position: Int): Int {
val detail = items[position]
return detail.viewType
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论