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
方法。