在具有改造结构的 Recycler 视图中使用 onClickListener - Kotlin

Using onClickListener in Recycler View with Retrofit Structure - Kotlin

你好,我有一个 recyclerview,其中填充了一些来自 Web 服务的数据,使用 Retrofit。

现在我想实现一个 onClickListener,所以当我单击 Recycler View 的每一行时,我可以看到来自该对象的更多数据,并尝试使用一些示例,但我被卡住了

这是我的适配器。我知道在 onCreateViewHolder 中,我应该在 Return AnunciosViewHolder 中放入第二个参数,类型为 cellClickListener,但我不知道我必须放什么。我尝试了 this@CellCLickListener 和 this@cellCLickListener,它给了我未解决的错误

class AnuncioAdapter(val anuncios: List<Anuncio>): RecyclerView.Adapter<AnunciosViewHolder>() {



        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnunciosViewHolder {

            val view = LayoutInflater.from(parent.context).inflate(R.layout.recyclerline, parent, false)
            return AnunciosViewHolder(view)
        }

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

        override fun onBindViewHolder(holder: AnunciosViewHolder, position: Int) {
            return holder.bind(anuncios[position])
        }


    }
    class AnunciosViewHolder(itemView : View,  private val cellClickListener: CellClickListener): RecyclerView.ViewHolder(itemView){
        private val morada: TextView = itemView.findViewById(R.id.morada)
        private val telemovel: TextView = itemView.findViewById(R.id.number)
        private val fotografia: ImageView = itemView.findViewById(R.id.image)



        fun bind(anuncio: Anuncio) {
            morada.text = anuncio.morada
            telemovel.text = anuncio.telemovel

            itemView.setOnClickListener {
                cellClickListener.onCellClickListener(anuncio)
            }



我也试过创建一个界面

interface CellClickListener {
    fun onCellClickListener (data: Anuncio)
}

在我的 Activity 中,我使用了这个方法,但它给了我一个错误,指出“什么都不覆盖”

override fun onCellClickListener(data: Anuncio) {
        val intent = Intent(this@ListaAnuncios, DetalhesActivity::class.java)
        intent.putExtra(PARAM_ID, data.id.toString())
        intent.putExtra(PARAM_MORADA, data.morada)
           intent.putExtra(PARAM_TELEMOVEL, data.telemovel)
        startActivityForResult(intent, newAnuncioActivityRequestCode1)
        Log.e("***ID", data.id.toString())
    }

更新

在使用 Praveen 提出的建议后,我能够从错误中清除我的适配器,但是我在 activity 部分挣扎

如果放

val anuncioAdapter = AnuncioAdapter(anuncios, this)

在我的 On Create 开始时,它无法识别 «anuncios»

但是我在 call.enqueue

中声明我的适配器
 recyclerView.apply {
                            setHasFixedSize(true)
                            layoutManager = 
                             LinearLayoutManager(this@ListaAnuncios)
                            adapter = AnuncioAdapter(response.body()!!)

                        }

它要求在这里传递一个 cellClickListener 的实例,但是如果我在这里使用 «this»,它表明我正在尝试传递一个回收器视图的实例而不是 CellClickListener

新更新

忘了把所有的call.enqueue方法

 call.enqueue(object : Callback<List<Anuncio>> {
            override fun onResponse(call: Call<List<Anuncio>>, response: Response<List<Anuncio>>) {
                if (response.isSuccessful){



                      recyclerView.apply {
                            setHasFixedSize(true)
                            layoutManager = 
                           LinearLayoutManager(this@ListaAnuncios)
                            adapter = AnuncioAdapter(response.body()!!)

                        }

                }
            }
            override fun onFailure(call: Call<List<Anuncio>>, t: Throwable) {
                Toast.makeText(this@ListaAnuncios, "${t.message}", Toast.LENGTH_LONG).show()
            }
        }) }

我尝试了@Praveen 和@aligur 的两种方法,但仍在努力让我将 Clicklistener 的实例作为第二个参数,但使用“this”是将 Recycler View 的实例而不是点击监听器

提前致谢

and in my Activity i put this method and it gives me an error that «overrides nothing»

您没有在 activity 中实施 CellClickListener。在 activity 的 class 名称声明后添加 CellClickListener

class MainActivity : AppCompatActivity(), CellClickListener {

}

I know that in the onCreateViewHolder, i should put in the Return AnunciosViewHolder a second parameter, of the type cellClickListener, but i have no idea what i have to put. I tried this@CellCLickListener and this@cellCLickListener and it gave me error that is is unresolved

您必须将 private val cellClickListener: CellClickListener 参数添加到 AnuncioAdapter 的构造函数,而不是 ViewHolder。只有这样你才能从你的 activity.

传递它

更改 AnuncioAdapterconstructor 以接受 CellClickListener 并从 AnunciosViewHolder

的构造函数中删除它
class AnuncioAdapter(
    private val anuncios: List<Anuncio>, 
    private val cellClickListener: CellClickListener
): RecyclerView.Adapter<AnunciosViewHolder>() {

}

要在 AnunciosViewHolder 中访问此 cellClickListener,您必须将其设为 AnuncioAdapterinner class,您可以这样做,因为它已经与adapter.

inner class AnunciosViewHolder(itemView : View): RecyclerView.ViewHolder(itemView){

}

现在,在 activity 中创建 AnuncioAdapter 的对象时,只需使用 this 传递 cellClickListener 的实例,因为它已经实现了它。

val anuncioAdapter = AnuncioAdapter(anuncios, this)

我认为最简单的方法是将函数作为参数传递给 RecyclerViewAdapter。

例如:

RecyclerViewAdapter(val clickListener : () -> Unit)

onCreateViewHolder(){
clickListener.invoke()
}

在您看来

adapter = ReceylerViewAdapter({
//do your stuff here
})

终于找到解决办法了。通过使用@Praveen 的建议,并找到这个例子 https://github.com/velmurugan-murugesan/Android-Example/tree/master/RetrofitWithRecyclerviewKotlin/app/src/main/java/app/com/retrofitwithrecyclerviewkotlin

在 activity 上,我在 OnCreate 方法之前添加了一个新的 val

lateinit var anuncioAdapter: AnuncioAdapter

在 onCreate 上添加了这个(所以我可以使用第一个建议)

val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
        anuncioAdapter = AnuncioAdapter(this,this)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.adapter = anuncioAdapter

并将 call.enqeue 上的 recyclerview.apply {} 更改为

anuncioAdapter.Anuncios(response.body()!!);

最后在适配器上创建了 Anuncios 方法

fun Anuncios(anuncio: List<Anuncio>){
        this.anuncios = anuncio;
        notifyDataSetChanged()
    }

有了这个,它就像我想要的那样工作。感谢帮助