是否可以在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)
}
答案 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 !!
}
}