在ViewHolder中实现对点击侦听器的访问权限,并可以访问关联的项目

时间:2019-01-28 23:23:05

标签: android android-recyclerview android-viewholder

我听说在onClickListener内部实现ViewHolder是一个好习惯。但是,我不确定如何访问与ViewHolder内部的onClickListener关联的项目。

例如:

import android.content.Context
import androidx.recyclerview.widget.RecyclerView
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import kotlinx.android.synthetic.main.post.view.*

import rstudio.vedantroy.swarm.MainActivity.Companion.TAG

class PostAdapter(private val items : List<Post>, private val contex: Context) : RecyclerView.Adapter<MyViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        return MyViewHolder(LayoutInflater.from(contex).inflate(R.layout.post, parent, false))
    }

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

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.bodyContent.text = items[position].content
    }
}


class MyViewHolder(view: View): RecyclerView.ViewHolder(view), View.OnClickListener {

    override fun onClick(v: View?) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    val bodyContent : TextView = view.bodyContent

}

如何访问items,以及如何找到ViewHolder的当前索引?

我查看了以下示例:Recyclerview(Getting item on Recyclerview),但是没有解释mDataSource的来源。

2 个答案:

答案 0 :(得分:0)

我设法通过移动PostViewHolder的位置来实现此行为。但是,我不确定inner class是否会破坏某些内容。

package rstudio.vedantroy.swarm

import android.content.Context
import androidx.recyclerview.widget.RecyclerView
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.cardview.widget.CardView
import kotlinx.android.synthetic.main.post.view.*

import rstudio.vedantroy.swarm.MainActivity.Companion.TAG

class PostAdapter(private val items : List<Post>, private val contex: Context) : RecyclerView.Adapter<PostAdapter.PostViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostViewHolder {
        return PostViewHolder(LayoutInflater.from(contex).inflate(R.layout.post, parent, false))
    }

    override fun getItemCount() = items.size

    override fun onBindViewHolder(holder: PostViewHolder, position: Int) {
        holder.bodyContent.text = items[position].content
    }

    inner class PostViewHolder(view: View): RecyclerView.ViewHolder(view) {
        val bodyContent : TextView = view.bodyContent

        init {
            view.apply {
                setOnClickListener {
                    isClickable = false
                    Log.d(TAG, "Clicked!")
                }
            }

        }

    }
}

答案 1 :(得分:0)

我个人认为不错的解决方案是将#include<iostream> #include<SFML/Graphics.hpp> int main() { using namespace sf; RenderTexture texture; texture.create(800, 600); texture.clear(Color::Black); texture.display(); texture.getTexture().copyToImage().saveToFile("D:\output\asd.bmp"); return 0; } 设置在OnClickListener内。

例如,

onBindViewHolder

我还发现,只需将// ... adapter class ... override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.view.apply { bodyContent.text = items[position].content setOnClickListener { // TODO Handle onClick } } } class ViewHolder(val view: View) : RecyclerView.ViewHolder(view) 存储在view内,就可以很容易地访问布局中的任何元素。