Skip to content

Instantly share code, notes, and snippets.

@webserveis
Created November 9, 2019 18:54
Show Gist options
  • Save webserveis/4ca3b2f6234df9181bd7ee69b0d5cb35 to your computer and use it in GitHub Desktop.
Save webserveis/4ca3b2f6234df9181bd7ee69b0d5cb35 to your computer and use it in GitHub Desktop.
RecyclerView con secciones

RecyclerView con secciones

Implementación de un RecyclerView con los datos agrupados y con un encabezado representativo

    private fun initRecyclerView() {
        val mAdapter = MySectionAdapter(dummyData3())
        recycler_view.setHasFixedSize(true)
        recycler_view.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        recycler_view.adapter = mAdapter

        mAdapter.setOnItemClickListener(object : MySectionAdapter.ClickListener {
            override fun onItemClick(v: View, position: Int) {

                Log.v(TAG, "onItemClick $position")

                Toast.makeText(
                    this@MainActivity,
                    "Clicked($position): ${mAdapter.getItem(position)}",
                    Toast.LENGTH_SHORT
                ).show()
            }

        })

    }

Datos de demostración

private fun dummyData3(): List<Any> {
    val myList = mutableListOf<Any>()
    myList.add(SectionModel("Section 1"))
    myList.add(MessageModel("Lorem ipsum dolor sit amet, consectetur adipiscing elit."))
    myList.add(MessageModel("Aliquam gravida ligula vitae turpis sodales consectetur."))
    myList.add(MessageModel("In sodales velit nec augue fringilla, a convallis quam vestibulum."))
    myList.add(MessageModel("Nunc gravida dui in dui feugiat, non lobortis nisi aliquet."))
    myList.add(MessageModel("Sed nec tortor imperdiet, consequat dui at, sagittis dui."))

    myList.add(SectionModel("Section 2"))
    myList.add(MessageModel("Duis vel tellus aliquet, finibus leo a, ultrices mi."))
    myList.add(MessageModel("Maecenas mattis diam ac nibh egestas, quis suscipit metus porta."))
    myList.add(MessageModel("Proin ut diam non lorem mollis porta ac nec ipsum."))
    myList.add(MessageModel("Nunc egestas tellus dapibus quam lacinia, in pellentesque mi bibendum."))

    myList.add(SectionModel("Section 3"))
    myList.add(MessageModel("Integer fringilla libero in risus pharetra rutrum."))
    myList.add(MessageModel("Mauris a nisi accumsan arcu lobortis luctus."))
    return myList
}
abstract class BaseViewHolder<T>(itemView: View) : RecyclerView.ViewHolder(itemView) {
abstract fun bind(item: T)
}
class MySectionAdapter(private val mDataSet: List<Any>?) :
RecyclerView.Adapter<BaseViewHolder<*>>() {
private var clickListener: ClickListener? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = when (viewType) {
TYPE_SECTION -> SectionViewHolder(LayoutInflater.from(parent.context)
.inflate(R.layout.simple_section_item_1, parent, false))
TYPE_MESSAGE -> MessageViewHolder(LayoutInflater.from(parent.context)
.inflate(R.layout.simple_list_item_1, parent, false))
else -> throw IllegalArgumentException("Invalid view type")
}
override fun onBindViewHolder(holder: BaseViewHolder<*>, position: Int) {
val item = mDataSet?.get(position)
when (holder) {
is SectionViewHolder -> holder.bind(item as SectionModel)
is MessageViewHolder -> holder.bind(item as MessageModel)
else -> throw IllegalArgumentException()
}
}
override fun getItemCount(): Int {
return mDataSet?.size ?: 0
}
fun getItem(position: Int): Any? {
//return if (mDataSet != null) mDataSet[position] else null
return mDataSet?.get(position)
}
override fun getItemViewType(position: Int): Int =
when (mDataSet?.get(position)) {
is SectionModel -> TYPE_SECTION
is MessageModel -> TYPE_MESSAGE
else -> throw IllegalArgumentException("Invalid type of data $position")
}
fun setOnItemClickListener(clickListener: ClickListener) {
this.clickListener = clickListener
}
inner class SectionViewHolder(itemView: View) : BaseViewHolder<SectionModel>(itemView) {
private var title: TextView = itemView.findViewById(android.R.id.text1) as TextView
override fun bind(item: SectionModel) {
title.text = item.title
}
}
inner class MessageViewHolder(itemView: View) : BaseViewHolder<MessageModel>(itemView), View.OnClickListener {
private val text1 = itemView.findViewById(android.R.id.text1) as TextView
init {
if (clickListener != null) {
itemView.setOnClickListener(this)
}
}
override fun bind(item: MessageModel) {
text1.text = item.message
}
override fun onClick(v: View?) {
if (v != null) {
clickListener?.onItemClick(v,adapterPosition)
}
}
}
companion object {
private const val TYPE_SECTION = 0
private const val TYPE_MESSAGE = 1
}
interface ClickListener {
fun onItemClick(v: View,position: Int)
}
}
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="Sub header"
android:textColor="?android:colorAccent"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead" />
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment