将 RecyclerView 适配器的结果返回给 MainActvity.kt? [英] Return the result from a RecyclerView adaptor back to the MainActvity.kt?

查看:24
本文介绍了将 RecyclerView 适配器的结果返回给 MainActvity.kt?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从我的 Recyclerview Adapter 返回位置结果,但我无法调用"adapter.setOnItemClickListener(this)";来自 MainActivity.kt?我收到错误未解析的引用:setOnItemClickListener"?

I am trying do I return the result of the position from my Recyclerview Adapter, but I can't call the " adapter.setOnItemClickListener(this)" from MainActivity.kt? I get the error "Unresolved reference: setOnItemClickListener"?

我不得不发布一个新线程,因为我无法显示所有代码 - 在花了好几个小时失败之后,我失去了生活的意愿:-(

I've had to post a new thread as I can't get all the code to be shown - after taking quite a few hours failing on this I am losing the will to live :-(

Adapter.kt

  class UsersAdapter(
    private val users: ArrayList<User>
    ) : RecyclerView.Adapter<UsersAdapter.DataViewHolder>() {
  class DataViewHolder(itemView: View) : 
          RecyclerView.ViewHolder(itemView) {
    fun bind(user: User) {
        itemView.textViewUserName.text = user.name
        Glide.with(itemView.imageViewAvatar.context)
            .load(user.avatar)
                .into(itemView.imageViewAvatar)
    }
 }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
        DataViewHolder(
                LayoutInflater.from(parent.context).inflate(
                        R.layout.item_layout, parent, false)             
        )
override fun getItemCount(): Int = Int.MAX_VALUE
override fun onBindViewHolder(holder: DataViewHolder, position: Int){ 
    val pos = position % users.size
    holder.bind(users[pos])        
    Log.d(Constraints.TAG, "onBindViewHolder:" + pos)
}
lateinit var listener: OnItemClickListener
public interface OnItemClickListener {
    fun getAdapterPosition(position : Int )
}
public fun setOnItemClickListener(listener: OnItemClickListener) {
    this.listener= listener
}

MainActivity.kt

class MainActivity : AppCompatActivity() {
lateinit var adapter: ConcatAdapter
lateinit var userVerticalAdapter: UsersAdapter
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setupDataInRecyclerView()
}
//override
public fun getAdapterPosition(position : Int ){
    // required value is in the position variable
    Log.d(Constraints.TAG, "This is where it is going!" )
}
private fun setupDataInRecyclerView() {
    recyclerView.layoutManager = LinearLayoutManager(this, 
              LinearLayoutManager.HORIZONTAL, false)
    userVerticalAdapter = UsersAdapter(DataSource.getUser())
    val listOfAdapters = listOf(userVerticalAdapter)
    adapter = ConcatAdapter(listOfAdapters)
    //This errors with "Unresolved reference: setOnItemClickListener"
    adapter.setOnItemClickListener(this)
    recyclerView.adapter = adapter
    recyclerView.scrollToPosition(Int.MAX_VALUE/2)
    ItemSnapHelper().attachToRecyclerView(recyclerView)
}
public fun ShowWhatRecieved(isitthere: Int){
    ShowMeIt.text = isitthere.toString()}
}

修订和更新 MainActvity.kt

class MainActivity : AppCompatActivity(), UsersAdapter.OnItemClickListener {
lateinit var adapter: ConcatAdapter
lateinit var userVerticalAdapter: UsersAdapter
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setupDataInRecyclerView()
}

override public fun getAdapterPosition(position : Int ){
    Log.d(Constraints.TAG, "This is where it is going!" )
}

private fun setupDataInRecyclerView() {
    recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
    userVerticalAdapter = UsersAdapter(DataSource.getUser())
    val listOfAdapters = listOf(userVerticalAdapter)
    adapter = ConcatAdapter(listOfAdapters)
    adapter.setOnItemClickListener(this)
    recyclerView.adapter = adapter
    recyclerView.scrollToPosition(Int.MAX_VALUE/2)
    ItemSnapHelper().attachToRecyclerView(recyclerView)
}
public fun ShowWhatRecieved(isitthere: Int){
    ShowMeIt.text = isitthere.toString()
}
}

推荐答案

尽管您通过创建接口并在回收器视图中实现它付出了所有努力,但我建议您使用 lambda 而不是接口,因为您正在编写 Kotlin 并编写一个在 Kotlin 中,对于 ClickListener,使用 lambda 代替接口是更简洁的方法.

Despite all your effort by creating an interface and implementing it inside your recycler-view, I suggest you use lambda instead of interface since you are writing Kotlin and writing a lambda instead of an interface is more cleaner approach in Kotlin for ClickListener.

为您的适配器和您的查看器创建一个 lambda 参数.因为你想传递点击项目的位置,所以你的 lambda 必须有一个 Int 输入,没有什么作为输出,所以它看起来像这样:listener: (Int) ->单位.

Create a lambda parameter both for your adapter and your viewholder. since you want to pass the position of clicked item so your lambda must have an Int input and nothing as output so it would look like this: listener: (Int) -> Unit.

你的其余代码将是这样的,你知道我刚刚编辑了重要部分:

Rest of your code would be something like this, you get the idea I just edited important parts:

class UsersAdapter(private val users : ArrayList<CrashlyticsReport.Session.User>,
                   private val listener : (Int) -> Unit) :
    RecyclerView.Adapter<UsersAdapter.DataViewHolder>() {
    
    class DataViewHolder(itemView : View, private val listener : (Int) -> Unit) :
        RecyclerView.ViewHolder(itemView) {
        
        init {
            itemView.setOnClickListener { listener(adapterPosition) }
        }
        
        fun bind(user : CrashlyticsReport.Session.User) {
            itemView.textViewUserName.text = user.name
            Glide.with(itemView.imageViewAvatar.context).load(user.avatar).into(itemView.imageViewAvatar)
        }
    }
}

然后在你的活动中你可以写:

then in your activity you can write:

userVerticalAdapter = UsersAdapter(DataSource.getUser()) {
//clicklistener event here
}

或:

userVerticalAdapter = UsersAdapter(DataSource.getUser(),this::ShowWhatRecieved)

此外,由于您使用的是 ConcatAdapter,因此最好使用 bindingAdapterPosition 而不是 adapterPosition.

also since you're using ConcatAdapter it's better to use bindingAdapterPosition instead of adapterPosition.

这篇关于将 RecyclerView 适配器的结果返回给 MainActvity.kt?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆