在具有改造结构的 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
.
传递它
更改 AnuncioAdapter
的 constructor
以接受 CellClickListener
并从 AnunciosViewHolder
的构造函数中删除它
class AnuncioAdapter(
private val anuncios: List<Anuncio>,
private val cellClickListener: CellClickListener
): RecyclerView.Adapter<AnunciosViewHolder>() {
}
要在 AnunciosViewHolder
中访问此 cellClickListener
,您必须将其设为 AnuncioAdapter
的 inner 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()
}
有了这个,它就像我想要的那样工作。感谢帮助
你好,我有一个 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
.
更改 AnuncioAdapter
的 constructor
以接受 CellClickListener
并从 AnunciosViewHolder
class AnuncioAdapter(
private val anuncios: List<Anuncio>,
private val cellClickListener: CellClickListener
): RecyclerView.Adapter<AnunciosViewHolder>() {
}
要在 AnunciosViewHolder
中访问此 cellClickListener
,您必须将其设为 AnuncioAdapter
的 inner 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()
}
有了这个,它就像我想要的那样工作。感谢帮助