在onBindViewHolder之外使用ViewHolder元素?

时间:2019-04-10 18:01:37

标签: android kotlin android-recyclerview

是否可以在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
         }
      }   
    }

FragmentA

 override fun onResume() {
        super.onResume()
        mAdapter.checkHashMapExists(hashMap,otList)
    }

4 个答案:

答案 0 :(得分:2)

即使我不建议使用它,您也可以调用以下方法在位置i上获取数据元素的ViewHolder:

MyViewHolder holder = (MyViewHolder) mRecyclerView.findViewHolderForAdapterPosition(i);
if(holder != null) {
    // Do whatever you want
}

请记住documentation对于该方法的看法:

  

在数据集的给定位置返回项目的ViewHolder。与findViewHolderForLayoutPosition(int)不同,此方法考虑了可能尚未反映到布局的任何挂起的适配器更改。 另一方面,如果调用了notifyDataSetChanged(),但尚未计算出新的布局,则此方法将返回null,因为在计算布局之前,新的视图位置是未知的

相反,如果我是我将做什么,是在您的模型类中具有一个属性,该属性指示其ViewHolder应该使用哪种颜色来显示txtView.title文本。

然后,每当您想要更新RecyclerView中一个或多个元素的颜色时,都可以更改模型类的属性,然后调用notifyDataSetChanged();

答案 1 :(得分:1)

通常,您不应该在ViewHolder之外使用onBindViewHolder。所有与UI相关的代码都应在onBindViewHolder内部调用。最好调用notifyDataSetChanged或其他notifyXXX方法来重绘RecyclerView的内容。

答案 2 :(得分:1)

适配器无法知道txvTitle的含义,因为它特定于RecyclerView中的单个项目。 但是,在ViewHolder中,此属性(如果存在)与正在“准备”的视图相关。

因此,仅在ViewHolder类中完成对视图的更新。

看看this示例。 在此示例中,创建了一个扩展RecyclerView.Viewholder(view)的单独的类。 在此类中,定义了一种名为bind的方法,该方法将传递用于填充视图的对象(或模型)。 create方法扩大了要在RecyclerView

中绘制的视图的布局

答案 3 :(得分:1)

您可以在适配器类中创建一个以 Higher order function 作为参数的函数,然后将该函数中的ViewHolder对象公开以在 Adapter之外使用班

看看如何做到:

假设您已适配器类如下

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
    }
}

现在我们可以从外部(对于您而言,是从Fragment类访问)

class Fragment {
    // Here we have adapter object
    ...
    //So, we get our callback like below from any method in here
    ...Inside some method where we receive callback
    adapter.holderCallback { viewHolder: RecyclerView.ViewHolder? -> //Here you've got ViewHolder object
        // Now do some amazing stuff here !!
    }
}