【问题标题】:context as a parameter takes this in android and allow us to implement method of interface. Why so?context 作为参数在 android 中采用 this 并允许我们实现接口的方法。为什么这样?
【发布时间】:2021-06-15 06:36:15
【问题描述】:

我的主要活动类 这是为了学习回收者视图和处理点击而实现的。下面的代码工作正常,但在实现监听器时我很困惑。下面列出了所有的疑问。帮忙吧。

package com.suasnom.pizzarecyclerview

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), isClickedInterface {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //implementing recycler view
         recycler_view.layoutManager= LinearLayoutManager(this)
        val data = fetchData()
        val adapter = CustomAdapter(data, this)
        recycler_view.adapter = adapter

    }

    fun fetchData(): ArrayList<String> {
        val list_Strings = ArrayList<String>()
        var str = ""
        for(i in 1..100){
            str = "${i} line"
            list_Strings.add(str)
        }
        return list_Strings
    }

    override fun onItemClicked(item: String) {
        Toast.makeText(this, "$item", Toast.LENGTH_LONG).show()
    }
} 

在这个声明中我通过了

val adapter = CustomAdapter(data, this)

它允许我覆盖以下方法:

override fun onItemClicked(item: String) {
        Toast.makeText(this, "$item", Toast.LENGTH_LONG).show()
    }

以下代码用于我编写该接口的回收器视图适配器:

package com.suasnom.pizzarecyclerview

import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.TextView
import android.view.View
import androidx.recyclerview.widget.RecyclerView


class CustomAdapter(val list_strings: ArrayList<String>, private val listner: isClickedInterface): RecyclerView.Adapter<PizzaViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PizzaViewHolder {

        val view = LayoutInflater.from(parent.context).inflate(R.layout.row, parent, false)
        val pizzaObject = PizzaViewHolder(view)
        view.setOnClickListener {
        listner.onItemClicked(list_strings[pizzaObject.adapterPosition])
         }
        return pizzaObject
    }

    override fun onBindViewHolder(holder: PizzaViewHolder, position: Int) {
        val data_incoming = list_strings[position]
        holder.text_message.text = data_incoming
    }

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

}

class PizzaViewHolder(private val view: View): RecyclerView.ViewHolder(view){
    val text_message = view.findViewById<TextView>(R.id.textrow)
}

interface isClickedInterface{
    fun onItemClicked(item: String){}
}

知道这是如何工作的。请帮忙...

【问题讨论】:

    标签: android kotlin android-recyclerview android-adapter


    【解决方案1】:

    在底部的CustomAdapter 内,您声明了isClickedInterface(它可能在其他任何地方声明或作为单独的文件声明)。它由您的MainActivity 实现(在: 之后),因此您必须在实现类中设置此接口方法 - 所以在Activity 中出现onItemClicked(item: String) 方法

    现在你的CustomAdapter 有构造函数参数来传递这个接口(第二个)。为了启动适配器的新实例,您已经传递了实现的接口,在这里您可以传递整个Activity,因为它实现了所需的接口(@98​​7654329@ - this 指向Activity,这也是一个isClickedInterface 接口实例)

    现在在 onCreateViewHolder 内部,您正在设置 setOnClickListener,在其中,您正在从构造函数中传递的接口调用方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-27
      • 2016-10-06
      • 2012-12-26
      • 1970-01-01
      • 2016-04-27
      • 1970-01-01
      相关资源
      最近更新 更多