Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Can';支架中的t访问视图_Android_Android Recyclerview_Kotlin_Anko - Fatal编程技术网

Android Can';支架中的t访问视图

Android Can';支架中的t访问视图,android,android-recyclerview,kotlin,anko,Android,Android Recyclerview,Kotlin,Anko,我正在尝试创建RecyclerView适配器和以下文档 private class Adapter(private val list: List<HashMap<String, Any>>, private val ctx: Context) : RecyclerView.Adapter<Adapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewTyp

我正在尝试创建
RecyclerView
适配器和以下文档

private class Adapter(private val list: List<HashMap<String, Any>>, private val ctx: Context) : RecyclerView.Adapter<Adapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Adapter.ViewHolder {
        var mTextView: TextView

        return ViewHolder(ctx.UI {
            relativeLayout {
                mTextView = textView("1 + 1 = 2")
            }
        }.view)
    }

    override fun getItemCount() = list.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.mTextView.text = "1 + 1 = 3" // Should work?
    }

    class ViewHolder(view: View) : RecyclerView.ViewHolder(view)
}
private类适配器(private-val-list:list,private-val-ctx:Context):RecyclerView.Adapter(){
override onCreateViewHolder(父级:ViewGroup,viewType:Int):Adapter.ViewHolder{
var mTextView:TextView
返回视图保持架(ctx.UI{
相对论{
mTextView=textView(“1+1=2”)
}
}(视图)
}
覆盖getItemCount()=list.size
覆盖BindViewHolder(holder:ViewHolder,位置:Int){
holder.mTextView.text=“1+1=3”//应该工作吗?
}
类ViewHolder(视图:视图):RecyclerView.ViewHolder(视图)
}

如何访问
onBindViewHolder
中的
mTextView

如果您使用的是kotlin扩展,并且有一个id为mTextView的文本视图,那么它应该是:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.itemView.mTextView.text = "1 + 1 = 3" // Should work?
    }
您还可以在ViewHolder中定义变量并直接使用它们,这是性能方面最好的方法,因为它不会强制执行不必要的调用:

然后访问它,如:

 holder.myTextView.text = "some text"

在这里,您需要做的是在
ViewHolder
中为
TextView
创建一个属性。这对于Anko来说并不特别容易,但这里有一些方法可以做到这一点


1.传递每个
视图
,您希望能够将
视图持有者
作为单独的构造函数参数进行引用。 对于此解决方案,您必须像这样修改
ViewHolder
类,为
TextView
添加一个属性:

class ViewHolder(view: View, val mTextView: TextView) : RecyclerView.ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Adapter.ViewHolder {
    return ViewHolder(ctx.UI {
        relativeLayout {
            textView("1 + 1 = 2") {
                id = TEXT_VIEW_ID
            }
        }
    }.view)
}
您可以用这种稍微复杂的方式初始化此属性:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Adapter.ViewHolder {
    lateinit var mTextView: TextView

    val view = ctx.UI {
        relativeLayout {
            mTextView = textView("1 + 1 = 2")
        }
    }.view

    return ViewHolder(view, mTextView)
}
虽然这看起来不太好,但您将
文本视图的引用保留在最初创建它时,因此它是高效的


2.给你的Anko创建的
视图
实例ID,然后通过它们的ID查找它们。 首先,您必须为ID创建常量-ID可以是任何正数,只要确保它们在您使用它们的范围内是唯一的。一种方法是将其放置在伴星对象中,如下所示:

companion object {
    private const val TEXT_VIEW_ID = 123 // Arbitrary positive number
}
然后,您需要将此ID提供给您的
TextView

class ViewHolder(view: View, val mTextView: TextView) : RecyclerView.ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Adapter.ViewHolder {
    return ViewHolder(ctx.UI {
        relativeLayout {
            textView("1 + 1 = 2") {
                id = TEXT_VIEW_ID
            }
        }
    }.view)
}
最后,您可以使用
findViewById
ViewHolder
类中再次找到您的
TextView

class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    val mTextView: TextView = view.findViewById(TEXT_VIEW_ID)
}
当然,这会更慢,因为当您将
视图
传递给
视图持有者
时,您将丢失已有的
文本视图
引用,然后再次查找它



请注意,我坚持使用
mTextView
来获得答案,以便更容易理解,但通常在Kotlin中使用匈牙利符号或任何其他名称前缀。

您能给出一个id为mTextView的文本视图的示例吗?答案的第一部分告诉您如何直接访问它,我会贴一个例子,唱一首变奏曲谢谢。我认为我的
mTextView
初始化是错误的,因为当我尝试您的解决方案时,我在
ViewHolder
中得到了
未解决的引用。我是否遗漏了什么?是否使用kotlin扩展导入了视图?在适配器中导入kotlinx.android.synthetic..*吗?哦。我明白你的意思。基本上,我是在
onCreateViewHolder
中创建视图。科特林·安科就是这么做的。那么,有没有一种方法可以传递变量名呢?或者我应该采用老派的方法呢?你的第一个答案不像你说的那么简单,但是当你的视图很少时,它也很好。我将继续使用
findViewById
方法。