Android: передать данные из RecyclerView в другое действие

У меня есть RecyclerView, и я должен передать данные в другое действие, когда вы нажимаете на элемент. Когда кто-то нажимает на первый элемент, мне нужно передать данные этого элемента в действие. Это та часть фрагмента, где находится вид рециркулятора:

class TrafficFragment : Fragment() {
    private lateinit var trafficViewModel: TrafficViewModel
     override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            trafficViewModel =
                ViewModelProviders.of(this).get(TrafficViewModel::class.java)
            val root = inflater.inflate(R.layout.fragment_traffic, container, false)

        //...

        val recyclerViewTraffic: RecyclerView = root.findViewById(R.id.recyclerViewTraffic)
        recyclerViewTraffic.apply {
           layoutManager = LinearLayoutManager (this@TrafficFragment.context)
           Log.d("DEBUG", MainActivity.clickArray.toString())
            adapter  = TrafficAdapter(MainActivity.clickArray){
                var intent = Intent(activity, ClickDetail::class.java)
                startActivity(intent)
            }

        }


        return root
      }
    }

Адаптер:

package com.example.example

import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.traffic_recycler_layout.view.*

class TrafficAdapter(private val trafficClick: List<TrafficClick>, val clickDetail: () -> Unit) :
RecyclerView.Adapter<TrafficAdapter.ViewHolder>(){

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val layoutView = LayoutInflater.from(parent.context).inflate(R.layout.traffic_recycler_layout, parent, false)
        return ViewHolder(layoutView)


    }

    override fun getItemCount(): Int = MainActivity.clicksNumber

    companion object{
        var idClick: String?= String()
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val clicks = trafficClick[position]
        holder.view.indirizzoIp.text = "${clicks.ip}"
        holder.view.isp.text= "${clicks.organization}"
        holder.view.data.text = "${clicks.data_creation}"
        holder.view.numberText.text = "${clicks.id_campaign}"
        holder.view.setOnClickListener {
           clickDetail.invoke()
        }

    }


    class ViewHolder(val view: View) : RecyclerView.ViewHolder(view)

}

и это действие, которое мне нужно открыть, когда я нажимаю на элемент с подробной информацией об этом элементе:

package com.example.example

import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.traffic_click_detail.*

class ClickDetail : AppCompatActivity(){

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.traffic_click_detail)


    }
}

Всего 2 ответа


var intent = Intent(activity, ClickDetail::class.java)
intent.putExtra("your_key",MainActivity.clickArray.toString())
startActivity(intent)

class ClickDetail : AppCompatActivity(){

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.traffic_click_detail)
        val YourData =  getIntent().getStringExtra("your_key") 
    }
}

Если я предполагаю, что вы хотите передать и id, замените это

holder.view.setOnClickListener {
    clickDetail.invoke()
}

от

holder.view.setOnClickListener {
    ClickDetail.launch(holder.itemView.context, /*your ID*/)
}

Затем, чтобы получить ваши данные

class ClickDetail : AppCompatActivity(){
    companion object {
        private const val EXTRA_KEY_ID = "CLICKDETAIL.EXTRA_KEY_ID"

        fun launch(launcher: Activity, id: Int) {
            val intent = Intent(launcher, ClickDetail::class.java)
                    .apply {
                        putExtra(EXTRA_KEY_ID, id)
                    }
            launcher.startActivity(intent)
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.traffic_click_detail)
        val id = intent.getIntExtra("EXTRA_KEY_ID") 
    }
}

Есть идеи?

10000