0

I'm writing code to use multiple viewtype. But also I have to do inflate TextView.

I wanna inflate holder.participant using loop.

The raw data of participant is "AAA#BBB#CCC". using split method, I wanna inflate TextView.

what should I do for this? what I wanna say is how to inflate TextView or other views, not multiple viewtype.


class ScheduleAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    lateinit var view : View
    lateinit var itemList: ArrayList<ScheduleItem>


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val context = parent.context
        val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater


        if(viewType == HEADER_TYPE){
            view = inflater.inflate(R.layout.schedule_header,parent,false)
            return HeaderViewHolder(view)
        }
        else if(viewType == ITEM_TYPE){
            view = inflater.inflate(R.layout.schedule_item,parent,false)
            return ItemViewHolder(view)
        }else{
            return HeaderViewHolder(view)
        }
    }

    override fun getItemCount(): Int = itemList.size

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        if(holder is HeaderViewHolder){
            holder.startDay.text = itemList.get(position).startDay
        }else if(holder is ItemViewHolder){
            holder.time.text = itemList.get(position).startTime+"~"+itemList.get(position).endTime
            holder.title.text = itemList.get(position).title
            holder.participant.text = itemList.get(position).participant
            holder.title.text = itemList.get(position).title


        }
    }


    inner class HeaderViewHolder internal constructor(itemView: View) :
        RecyclerView.ViewHolder(itemView) {
        internal var startDay: TextView

        init {
            startDay = itemView.findViewById(R.id.startDay)
        }
    }

    inner class ItemViewHolder internal constructor(itemView: View) :
        RecyclerView.ViewHolder(itemView) {
        internal var time: TextView
        internal var title: TextView
        internal var participant: TextView
        internal var place: TextView



        init {
            time = itemView.findViewById(R.id.time)
            title = itemView.findViewById(R.id.title)
            participant = itemView.findViewById(R.id.participant)
            place = itemView.findViewById(R.id.place)

        }


    }


    fun addItems(items : ArrayList<ScheduleItem>){
        items.addAll(items)
    }

}
Twisha Kotecha
  • 1,082
  • 1
  • 4
  • 18
jakchang
  • 402
  • 5
  • 13
  • Please have a look at this [answer](https://stackoverflow.com/a/3663829/7948109) you can use android's provided `TextView` instead of creating a custom layout – Rahul Gaur Feb 24 '20 at 08:21

1 Answers1

0

I did some corrections to your code. Maybe will help you

class ScheduleAdapter : RecyclerView.Adapter<ScheduleAdapter.BaseViewHolder>() {

    private val itemsList = mutableListOf<ScheduleItem>()

    override fun getItemCount(): Int = itemList.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
        return when (viewType) {
            HEADER_TYPE -> HeaderViewHolder.create(parent)
            ITEM_TYPE -> ItemViewHolder.create(parent)
            // TEXT_TYPE -> TextItemHolder.create(parent)
        }
    }

    override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
        holder.bind(itemsList.get(position))
    }    

    fun addItems(items: Collection<ScheduleItem>) {
        itemsList.addAll(items)
        notifyDataSetChanged()
    }

    fun clear() {
        itemsList.clear()
        notifyDataSetChanged()
    }

    abstract internal class BaseViewHolder 
    internal constructor(itemView: View) : RecyclerView.ViewHolder(itemView) {

        abstract fun bind(item: ScheduleItem);
    }

    internal class HeaderViewHolder
    internal constructor(itemView: View): BaseViewHolder(itemView) {

        internal var startDay: TextView

        init {
            // initialize here your views
        }

        override fun bind(item: ScheduleItem) {
            startDay.text = item.startDay
        }

        companion object {

            @JvmStatic
            fun create(container: ViewGroup): HeaderViewHolder {
                val inflater = LayoutInflater.from(container.context)

                return HeaderViewHolder(
                    inflater.inlate(R.layout.schedule_header), container, false
                )
            }
        }
    }  

    internal class ItemViewHolder
    internal constructor(itemView: View): BaseViewHolder(itemView) {

        internal var time: TextView
        internal var title: TextView
        internal var participant: TextView
        internal var place: TextView

        init {
            // initialize here your views 
        }

        override fun bind(item: ScheduleItem) {
            time.text = item.startTime+"~"+item.endTime
            title.text = item.title
            participant.text = item.participant
            title.text = item.title
        }

        companion object {

            @JvmStatic
            fun create(container: ViewGroup): ItemViewHolder {
                val inflater = LayoutInflater.from(container.context)

                return ItemViewHolder(
                    inflater.inlate(R.layout.schedule_item), container, false
                )
            }
        }
    }

    internal class TextItemHolder
    internal constructor(val textView: TextView): BaseViewHolder(textView) {

        override fun bind(item: ScheduleItem) {
            textView.text = "Set your values here"
        }

        companion object {

            @JvmStatic
            fun create(container: ViewGroup): TextItemHolder {
                val textView = TextView(container.context)

                textView.layoutParams = ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT
                )

                return TextItemHolder(textView)
            }
        }
    }
}

P.S: I didn't test this code on my machine. There might be some syntax errors :)