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

Android Kotiln:将数据从适配器传递到活动,android,android-intent,android-activity,kotlin,android-recyclerview,Android,Android Intent,Android Activity,Kotlin,Android Recyclerview,我尝试使用putExtra将数据从适配器传递到我的另一个活动,但当我单击列表中的某个项目移动到我的第二个活动时,不会检索到任何数据,也不会显示我输入的默认文本。 还有别的办法吗?或者我错过了什么? 这是我的代码: MyonBindViewHolder: 我的第二个活动: 方法1: class YourAdapter(private val clickListener: (yourData: YourData) -> Unit) : RecyclerView.Adapter<Y

我尝试使用
putExtra
将数据从
适配器
传递到我的另一个
活动
,但当我单击列表中的某个项目移动到我的第二个
活动
时,不会检索到任何数据,也不会显示我输入的默认文本。 还有别的办法吗?或者我错过了什么? 这是我的代码:

My
onBindViewHolder

我的第二个
活动


方法1:

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) }
        }
}
您可以使用
回调
首先,在适配器中定义回调,如下所示:

    interface CallbackInterface {   
        fun passResultCallback(message: String)
    }
holder.itemView.setOnClickListener {
        //Set your codes about intent here
        callbackInterface.passResultCallback("Your message")
}
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"
    }
}
然后在
适配器中初始化回调
接口

class YourAdapter(private val callbackInterface:CallbackInterface) :
    RecyclerView.Adapter<CurrencyListAdapter.ViewHolder>() {
.
.
.
}
最后,在
活动中实现
回调
方法,如下所示:

    interface CallbackInterface {   
        fun passResultCallback(message: String)
    }
holder.itemView.setOnClickListener {
        //Set your codes about intent here
        callbackInterface.passResultCallback("Your message")
}
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"
    }
}

更新:

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) }
        }
}
方法2:

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) }
        }
}
如果您在编写时未使用
回调
,只需将
活动
更改为:

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}")
    }
}

更新日期:2019年12月26日

方法3:KOTLIN碱

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

    interface CallbackInterface {   
        fun passResultCallback(message: String)
    }
holder.itemView.setOnClickListener {
        //Set your codes about intent here
        callbackInterface.passResultCallback("Your message")
}
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"
    }
}
在我们的适配器中:

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) }
        }
}

你不认为解决方案应该遵循他的模式吗?我的意思是它只是将数据从一个意图解析到另一个意图!!!好吧,我明白了,但是你怎么跳到我的活动中去呢,因为之前,我在做val intent=intent(holder.itemView.context,TracksActivity::class.java),但现在我怎么做?@whates,请再次阅读问题他/她说“另一种方式做或者我错过了什么?”,然后我决定解释另一种方式way@tibdev78 ,你可以在onBindViewHolderI中的setOnClickListener中设置关于意图的代码,我今晚测试了这个,并告诉你可能你看起来不太好。请尝试Log.e(“dd”,“${msg}”),并将Logcat从Verbose/Debug切换到Error,然后重试。