-2

I would like to start a new activity from a RecyclerView with Kotlin.

I am still exploring Kotlin and currently stuck on how to open a new activity from a RecyclerView.

class HomeScreenRecyclerAdapter : RecyclerView.Adapter<HomeScreenRecyclerAdapter.ViewHolder>()
{
    private val titles = arrayOf("About Me",
            "About Me", "About Me", "About Me"
    )
    private val details = arrayOf("Item one details", "Item two details",
            "Item three details", "Item four details")


    private val images = intArrayOf(R.drawable.ic_launcher_background,
            R.drawable.ic_launcher_background, R.drawable.ic_launcher_background,
            R.drawable.ic_launcher_background)

    override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder {
        val v = LayoutInflater.from(viewGroup.context)
                .inflate(R.layout.main_card_view, viewGroup, false)
        return ViewHolder(v)
    }

    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
        viewHolder.itemTitle.text = titles[position]
        viewHolder.itemDetail.text = details[position]
        viewHolder.itemImage.setImageResource(images[position])
    }

    override fun getItemCount(): Int {
        return titles.size
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val intent: Intent? = null
        var itemImage: ImageView
        var itemTitle: TextView
        var itemDetail: TextView
        init {
            itemImage = itemView.findViewById(R.id.main_image_view)
            itemTitle = itemView.findViewById(R.id.main_title_view)
            itemDetail = itemView.findViewById(R.id.main_description_view)

            itemView.setOnClickListener { 

            }
        }
    }
}

I just cant figure out how to start a new activity for each item within the RecyclerView. I know I am making it more complicated than it is.

a_local_nobody
  • 7,947
  • 5
  • 29
  • 51
Brummerly
  • 90
  • 1
  • 11

3 Answers3

3

Just use this :

context.startActivity(Intent(context, Activity::class.java))
Wisdomrider
  • 170
  • 7
1

Just start the activity within the ViewHolder itemOnClick method as like below. And you need to pass the context reference of adapter's activity.

class HomeScreenRecyclerAdapter(var mContext:Context) : RecyclerView.Adapter<HomeScreenRecyclerAdapter.ViewHolder>()
{
    private val titles = arrayOf("About Me",
        "About Me", "About Me", "About Me")

    private val details = arrayOf("Item one details", "Item two details",
        "Item three details", "Item four details")


    private val images = intArrayOf(R.drawable.ic_launcher_background,
        R.drawable.ic_launcher_background, R.drawable.ic_launcher_background,
        R.drawable.ic_launcher_background)

    override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder {
       val v = LayoutInflater.from(viewGroup.context)
            .inflate(R.layout.main_card_view, viewGroup, false)
       return ViewHolder(v)
    }

    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
       viewHolder.itemTitle.text = titles[position]
       viewHolder.itemDetail.text = details[position]
       viewHolder.itemImage.setImageResource(images[position])
    }

    override fun getItemCount(): Int {
       return titles.size
    }

   inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
      val intent: Intent? = null
      var itemImage: ImageView
      var itemTitle: TextView
      var itemDetail: TextView
     init {
        itemImage = itemView.findViewById(R.id.main_image_view)
        itemTitle = itemView.findViewById(R.id.main_title_view)
        itemDetail = itemView.findViewById(R.id.main_description_view)

        itemView.setOnClickListener { 
             mContext.startActivity(Intent(mContext, ActivityNameWhichYouWantCall::class.java))
        }
    }
  }
}
Fahry Mohammed
  • 599
  • 5
  • 18
-1

Just try this solution: Firstly in your adapter write listener to your recyclerview items:

class HomeScreenRecyclerAdapter(val data: ArrayList<Data>) : RecyclerView.Adapter<ContactAdapter.ViewHolder>() {
private var listener: ((Data) -> Unit)? = null
...

fun setOnItemClickListener(f: (Data) -> Unit) {
     listener = f
}

And inside init :

 itemView.setOnClickListener {
      listener?.invoke(data[adapterPosition])
 }

And Finally in your Activity you can take handle item clickListeners:


private val data = ArrayList<Data>()
val adapter = HomeScreenRecyclerAdapter(data)

 adapter.setOnItemClickListener {
    when(it){
      1->{startActivity(Intent(context, YourActivity1::class.java))}
      2->{startActivity(Intent(context, YourActivity2::class.java))}
      ...
      else->{}
    }
 }

There Data is model class of your item. That's all, I hope this help you!