jakchang
jakchang

Reputation: 452

using viewtype , onBindViewHolder and onCreateViewHolder are different

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

Upvotes: 0

Views: 431

Answers (1)

Gunaseelan
Gunaseelan

Reputation: 15535

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
}

Upvotes: 2

Related Questions