【问题标题】:How Can I create Interface for ItemClickListener in Kotlin?如何在 Kotlin 中为 ItemClickListener 创建接口?
【发布时间】:2020-09-18 11:42:50
【问题描述】:

我是 Android 和 Kotlin 的新手。我想单击我的行并将其用于其他活动。这就是为什么我试图在我的适配器中创建一个接口但它不起作用的原因。如何创建它?

我的适配器代码:

class NoteAdapter(private val titleTextArray: ArrayList<String>, private val imageArray: ArrayList<String>) : RecyclerView.Adapter<NoteAdapter.NoteHolder>() {

    class NoteHolder (view: View) : RecyclerView.ViewHolder(view) {
      
            var recyclerTitleText: TextView ?= null
            var recyclerImageView: ImageView ?= null

        init {
            recyclerTitleText = view.findViewById(R.id.recyclerTitleText)
            recyclerImageView = view.findViewById(R.id.recyclerImage)
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NoteHolder {
        val inflater = LayoutInflater.from(parent.context)
        val view = inflater.inflate(R.layout.recycler_row, parent, false)
        return NoteHolder(view)
    }

    override fun onBindViewHolder(holder: NoteHolder, position: Int) {
        holder.recyclerTitleText?.text = titleTextArray[position]
        Picasso.get().load(imageArray[position]).into(holder.recyclerImageView)

    }

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

【问题讨论】:

    标签: android kotlin android-recyclerview adapter


    【解决方案1】:

    使用 Kotlin,您可以使用 lambda(高阶函数)来获取用户在持有人中的点击次数。例如,基本方法可能是下一个:

    class YourAdapter(
        private val listener: (String) -> Unit
    ) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    
        private val yourDataList = emptyList<String>()
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
            val view = LayoutInflater.from(parent.context).inflate(R.layout.compound_checkbox_terms_layout, parent, false)
            return YourViewHolder(view)
        }
    
        override fun getItemCount(): Int {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }
    
        override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }
    
    
        private inner class YourViewHolder(view: View) : RecyclerView.ViewHolder(view) {
            
            init {
                if (adapterPosition != RecyclerView.NO_POSITION) {
                    val selectedData = yourDataList[adapterPosition]
                    listener.invoke(selectedData)
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      将 Activity 上下文从 Activity 传递给适配器,以便它可以启动 Intent

      活动代码:

      mAdapter = new CustomAdapter(this, imageArray, ArrayList);
      

      适配器代码:

      class NoteAdapter(private val titleTextArray: ArrayList, private val imageArray: ArrayList, private val context : Context) : RecyclerView.Adapter<NoteAdapter.NoteHolder>() {
          class NoteHolder (view: View) : RecyclerView.ViewHolder(view) {
              var recyclerTitleText: TextView?= null
              var recyclerImageView : ImageView?= null
              init {
                  recyclerTitleText = view.findViewById(R.id.recyclerTitleText)
                  recyclerImageView = view.findViewById(R.id.recyclerImage)
              }
          }
      
          override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NoteHolder {
      
              val inflater = LayoutInflater.from(parent.context)
              val view = inflater.inflate(R.layout.recycler_row, parent, false)
              return NoteHolder(view)
      
          }
      
          override fun onBindViewHolder(holder: NoteHolder, position: Int) {
      
              holder.recyclerTitleText?.text = titleTextArray[position]
              Picasso.get().load(imageArray[position]).into(holder.recyclerImageView)
              holder.recyclerImageView.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      Intent intent = new Intent(context, NesneTani.class);
                      context.startActivity(intent);
                  }
              });
          }
      
          override fun getItemCount(): Int {
      
              return titleTextArray.size
      
          }
      }
      

      【讨论】:

        【解决方案3】:

        创建一个接口来捕捉点击事件。 (位置是可选的)

        interface OnItemClickListener {
        fun onItemClick(position: Int)
        

        }

        在适配器类中添加 OnItemClickListener 作为参数

        class NoteAdapter(
        private val titleTextArray: ArrayList<String>,
        private val imageArray: ArrayList<String>,
        private val listener: OnItemClickListener
        ) : RecyclerView.Adapter<NoteAdapter.NoteHolder>() 
        

        然后在onBindViewHolder里面做下面

         override fun onBindViewHolder(holder: NoteHolder, position: Int) {
         listener.onItemClick(position)
        }
        

        现在在您的活动中,实现 OnItemClickListener

        class ActivityName implements OnItemClickListener{}
        

        在启动适配器时,执行此操作

        mAdapter = new CustomAdapter(this, imageArray, ArrayList);
        

        然后在被覆盖的方法中做你想做的事

        override fun onItemClick(position: Int) {
        //start the activity you want.
        }
        

        【讨论】:

        • OnBindViewHolder 中的代码,它显示了关于覆盖和位置的错误。
        • 你能告诉我具体的问题是什么吗?
        • 错误解释是:对于位置,它想要Arraylist,对于覆盖,它不适用于本地函数。我试图解决但不起作用。谢谢
        • 我尝试执行相同的代码,但在 onBindViewHolder 内部没有遇到任何问题。您能否执行您的代码并在您的问题中发布日志?这将有助于理解它。
        猜你喜欢
        • 2023-02-24
        • 1970-01-01
        • 2020-12-31
        • 2016-10-06
        • 2015-06-08
        • 1970-01-01
        • 2023-01-30
        • 1970-01-01
        • 2020-05-29
        相关资源
        最近更新 更多