Kotiln:将数据从适配器传递到活动

tib*_*v78 4 android android-intent android-activity kotlin android-recyclerview

我尝试使用 a 将我的数据从 传递adapter给我的另一个activityputExtra但是当我单击列表中的一个项目移动到我的第二个时activity,没有检索到任何数据,也没有显示我输入的默认文本。另一种方法呢?或者我想念它什么?这是我的代码:

我的onBindViewHolder

override fun onBindViewHolder(holder: AlbumsListViewHolder, position: Int) {
    val AlbumsData = albumsData!![position]
    holder.albumsName.text = AlbumsData.title

    Glide.with(holder.itemView)
        .load(AlbumsData.cover)
        .transition(DrawableTransitionOptions.withCrossFade())
        .into(holder.coverImage)

    holder.itemView.setOnClickListener {
        val intent = Intent(holder.itemView.context, TracksActivity::class.java)
        //listener?.onClick(AlbumsData)
        intent.putExtra("dd", "ff")
        holder.itemView.context.startActivity(intent)
    }
}
Run Code Online (Sandbox Code Playgroud)

我的第二个Activity

class TracksActivity: AppCompatActivity(), TracksView {

    private var albumsAdapter: AlbumsAdapter? = null

    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, persistentState)
        setContentView(R.layout.activity_tracks)

        //albumsAdapter = findViewById(R.id.trackslist_recycleview)
        val msg = intent.getStringExtra("dd")
        Log.d("dd", "${msg}")
    }
}
Run Code Online (Sandbox Code Playgroud)

mil*_*imi 6

方法一:

您可以使用callback 首先,在您的适配器中定义一个回调,如下所示:

    interface CallbackInterface {   
        fun passResultCallback(message: String)
    }
Run Code Online (Sandbox Code Playgroud)

然后interface在您的 中初始化回调adapter

class YourAdapter(private val callbackInterface:CallbackInterface) :
    RecyclerView.Adapter<CurrencyListAdapter.ViewHolder>() {
.
.
.
}
Run Code Online (Sandbox Code Playgroud)

然后使用内部接口中的回调方法,onBindViewHolder()如下所示:

holder.itemView.setOnClickListener {
        //Set your codes about intent here
        callbackInterface.passResultCallback("Your message")
}
Run Code Online (Sandbox Code Playgroud)

最后,像这样实现你的callback方法activity

class TracksActivity: AppCompatActivity(), TracksView , YourAdapterName.CallbackInterface {

    private var albumsAdapter: AlbumsAdapter? = null

    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, persistentState)
        setContentView(R.layout.activity_tracks)
    }

  override fun passResultCallback(message: String) {
         //message is "ff"
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

方法二:

如果您不使用callback,就像您所写的那样,只需将您的更改activity为:

class TracksActivity: AppCompatActivity(), TracksView {

    private var albumsAdapter: AlbumsAdapter? = null

    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, persistentState)
        setContentView(R.layout.activity_tracks)

        var bundle : Bundle? = intent.extras
        var message = bundle!!.getString("dd") 
        Log.d("dd", "${message}")
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:2019 年 12 月 26 日

方法三:KOTLIN BASE

我们可以将一个 fun 传递给适配器并从中获取数据,如下所示:

在我们的适配器中:

class YourAdapter(private val clickListener: (yourData: YourData) -> Unit) :
    RecyclerView.Adapter<YourAdapter.ViewHolder>() {

//YourData like String

//And we have onCreateViewHolder like this 

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = ViewHolder(
        LayoutInflater.from(parent.context).inflate(R.layout.your_item, parent,false),
        clickListener
    )

//And we have ViewHolder class like this 

  inner class ViewHolder(itemView: View, private val clickListener: (yourData: YourData) -> Unit) :
        RecyclerView.ViewHolder(itemView) {
.
.
.
     init {
            initClickListeners()
        }

//And pass data here with invoke


        private fun initClickListeners() {
            itemView.setOnClickListener { clickListener.invoke(yourData) }
        }
}
Run Code Online (Sandbox Code Playgroud)

在我们的片段或活动中,我们可以通过这种方式获取数据:

YourAdapter { yourData ->
            // we can use yourData here
            }
Run Code Online (Sandbox Code Playgroud)