Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 是否在onBindViewHolder外部使用ViewHolder元素?_Android_Kotlin_Android Recyclerview - Fatal编程技术网

Android 是否在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 =

是否可以在onBindViewHolder之外使用ViewHolder元素

这是我的适配器类

    @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
添加到适配器中。当