Android 是否在onBindViewHolder外部使用ViewHolder元素?
是否可以在onBindViewHolder之外使用ViewHolder元素 这是我的适配器类Android 是否在onBindViewHolder外部使用ViewHolder元素?,android,kotlin,android-recyclerview,Android,Kotlin,Android Recyclerview,是否可以在onBindViewHolder之外使用ViewHolder元素 这是我的适配器类 @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = mValues[position] with(holder.mView) { tag =
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = mValues[position]
with(holder.mView) {
tag = item
txvTitle.text = item.title
setOnClickListener(mOnClickListener)
}
}
inner class ViewHolder(val mView: View) :RecyclerView.ViewHolder(mView{})
如果适配器中有一个函数,如何使用txvTitle
fun checkHashMapExists(hashMap: HashMap<Long, ABC>?, newValues: ArrayList<OT>){
for(i in newValues){
if(hashMap?.keys.toString().contains(i.id)){
txvTitle.setTextColor(Color.parseColor("#000000")) // txvTitle cannot resolved
}
}
}
通常,您不应在
onBindViewHolder
外部使用ViewHolder
。所有与UI相关的代码都应该在onBindViewHolder
中调用。喜欢调用notifyDataSetChanged
或其他notifyXXX
方法来重新绘制RecyclerView
内容。通常您不应该在onBindViewHolder
外部使用ViewHolder
。所有与UI相关的代码都应该在onBindViewHolder
中调用。更愿意调用notifyDataSetChanged
或其他notifyXXX
方法来重新绘制RecyclerView
内容。即使我不建议使用它,您也可以调用以下方法来获取位于I
位置的数据元素的视图持有者:
MyViewHolder holder = (MyViewHolder) mRecyclerView.findViewHolderForAdapterPosition(i);
if(holder != null) {
// Do whatever you want
}
请记住有关该方法的说明:
在数据集的给定位置返回项目的ViewHolder
。与findViewHolderForLayoutPosition(int)
不同,此方法考虑了可能尚未反映到布局的任何挂起的适配器更改另一方面,如果调用了notifyDataSetChanged()
,但尚未计算新布局,则此方法将返回null,因为在计算布局之前,视图的新位置是未知的
相反,如果我是您,我会做的是在您的模型类中有一个属性,该属性指示其ViewHolder应该使用哪个颜色来显示txtView.title
文本
然后,每当您想要更新RecyclerView中元素的颜色时,您可以更改模型类的该属性,然后调用
notifyDataSetChanged()
即使我不建议使用它,您也可以调用以下方法来获取位于I
位置的数据元素的ViewHolder:
MyViewHolder holder = (MyViewHolder) mRecyclerView.findViewHolderForAdapterPosition(i);
if(holder != null) {
// Do whatever you want
}
请记住有关该方法的说明:
在数据集的给定位置返回项目的ViewHolder
。与findViewHolderForLayoutPosition(int)
不同,此方法考虑了可能尚未反映到布局的任何挂起的适配器更改另一方面,如果调用了notifyDataSetChanged()
,但尚未计算新布局,则此方法将返回null,因为在计算布局之前,视图的新位置是未知的
相反,如果我是您,我会做的是在您的模型类中有一个属性,该属性指示其ViewHolder应该使用哪个颜色来显示txtView.title
文本
然后,每当您想要更新RecyclerView中元素的颜色时,您可以更改模型类的该属性,然后调用
notifyDataSetChanged()
适配器无法知道txvTitle的含义,因为它特定于回收视图中的单个项目。
但是,在视图持有者中,此属性(如果存在)与正在“准备”的视图相关
因此,只能在ViewHolder
类中更新视图
请看一个例子。
在本例中,创建了一个单独的类,该类扩展了RecyclerView.Viewholder(视图)
。
在这个类中,定义了一个名为bind
的方法,该方法被传递给用于填充视图的对象(或模型)。
create
方法将在RecyclerView
中绘制的视图的布局放大,适配器无法知道txvTitle
的含义,因为它特定于RecyclerView
中的单个项目。
但是,在视图持有者中,此属性(如果存在)与正在“准备”的视图相关
因此,只能在ViewHolder
类中更新视图
请看一个例子。
在本例中,创建了一个单独的类,该类扩展了RecyclerView.Viewholder(视图)
。
在这个类中,定义了一个名为bind
的方法,该方法被传递给用于填充视图的对象(或模型)。
create
方法将在RecyclerView
中绘制的视图的布局放大。您可以在适配器类中创建一个函数,该函数以为参数,然后在该函数中显示您的ViewHolder
对象,以便在适配器类之外使用
看看如何做到这一点:
假设您有适配器类,如下所示
class Adapter {
...
// Here we create object of our Higher order function
var holderCallback: ((RecyclerView.ViewHolder?) -> Unit)? = null
//Then We provide callback like below in onBindViewHolder method
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
... Some binding stuff
holderCallback?.let {
it(holder)
}
... even some more stuff
}
}
现在我们可以从外部访问(在您的情况下,从片段类)
您可以在适配器类中创建一个以为参数的函数,然后在该函数中公开ViewHolder
对象,以便在适配器类之外使用
看看如何做到这一点:
假设您有适配器类,如下所示
class Adapter {
...
// Here we create object of our Higher order function
var holderCallback: ((RecyclerView.ViewHolder?) -> Unit)? = null
//Then We provide callback like below in onBindViewHolder method
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
... Some binding stuff
holderCallback?.let {
it(holder)
}
... even some more stuff
}
}
现在我们可以从外部访问(在您的情况下,从片段类)
我想在从片段调用函数时更改txvTitle颜色。在这种情况下如何使用notifyDataSetChanged?@JohnJoe将someField
添加到适配器中。从someField
的片段更新值调用函数时,调用notifyDataSetChanged
。在onBindViewHolder
内部,您应该尊重someField
。比如:if(someField){use color1}else{use color2}
我想在从片段调用函数时更改txvTitle颜色。在这种情况下如何使用notifyDataSetChanged?@JohnJoe将someField
添加到适配器中。当