Akshay Kondekar
Akshay Kondekar

Reputation: 136

How to add Header to recyclerview in kotlin?

after getting successful response, Header added to first position of recyclerview but first item of list not showing. list having 5 items but its shows only last 4 items. how to show all list items with extra added header in recyclerview.

class AllCategoryAdapter(val categoryList : List<AllCategoryBean>) : RecyclerView.Adapter<RecyclerView.ViewHolder>()
{
    private val TYPE_HEADER : Int = 0
    private val TYPE_LIST : Int = 1

    override fun getItemViewType(position: Int): Int {

        if(position == 0)
        {
            return TYPE_HEADER
        }
        return TYPE_LIST
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        if(viewType == TYPE_HEADER)
        {
            val header = LayoutInflater.from(parent.context).inflate(R.layout.cv_all_category_header,parent,false)
            return ViewHolderHeader(header)
        }

        val header = LayoutInflater.from(parent.context).inflate(R.layout.cv_all_category,parent,false)
        return ViewHolder(header)
    }

    override fun getItemCount(): Int {
        return categoryList.size + 1
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val listItem : AllCategoryBean = categoryList[position]

        if(holder is ViewHolderHeader)
        {
            holder.tvCategoyName.setText("All Category")
        }

        if(holder is ViewHolder)
        {
            holder.tvCategoyName.setText(listItem.getCategoryName())
        }
    }

    class ViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView)
    {
        val tvCategoyName = itemView.findViewById(R.id.tvCategoyName) as TextView
    }

    class ViewHolderHeader(itemView : View) : RecyclerView.ViewHolder(itemView)
    {
        val tvCategoyName = itemView.findViewById(R.id.tvCategoyName) as TextView
    }

}

Upvotes: 2

Views: 9133

Answers (1)

Naruto Uzumaki
Naruto Uzumaki

Reputation: 2087

As @hiddeneyes02 commented in your question, you should be getting ArrayIndexOutOfBoundsException.

BTW when you increased categoryList size by override fun getItemCount(), you must also decrease position by one for getting related item in your list when holder is instance of your view, not header.
So your onBindViewHolder must look like this:

 override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

    if (holder instanceof ViewHolderHeader) {
        holder.tvCategoyName.setText("All Category")
    } else if (holder instanceof ViewHolder) {
        val listItem : AllCategoryBean = categoryList[position - 1]
        holder.tvCategoyName.setText(listItem.getCategoryName())
    }

Upvotes: 2

Related Questions