我刚刚生成了一个Master/Detail Flow
项目,我发现了一些奇怪的内容:在DriverListActivity.java
内,名为ViewHolder
的子类具有final
个属性。由于ViewHolder
内的数据可能被替换,
为什么属性设置为final
??
public class ViewHolder extends RecyclerView.ViewHolder {
public final View mView; //???????
public final TextView mIdView; //???????
public final TextView mContentView; //???????
public DummyContent.DummyItem mItem;
//CONSTRUCTOR
public ViewHolder(View view) {
super(view);
mView = view;
mIdView = (TextView) view.findViewById(R.id.id);
mContentView = (TextView) view.findViewById(R.id.content);
}
@Override
public String toString() {
return super.toString() + " '" + mContentView.getText() + "'";
}
}
答案 0 :(得分:1)
最终并不意味着对象无法变异。最后意味着引用本身不能被替换。您仍然可以在最终引用上调用mIdView.setText()。
在C中可以想象它有一个指针(一个引用)和一个值。最后意味着指针是不可变的,而不是它指向的值。 ViewHolder一旦创建就不会改变其内部视图的值 - 这就是我们使用ViewHolder模式的原因 - 这些参考是不变的。
答案 1 :(得分:0)
RecyclerView
将创建有限数量的特定ViewHolder
。例如,您的数据集中有100个类似项目不意味着您将创建100个ViewHolder
。你需要大约那么多ViewHolder
s来填充屏幕视口,比如10项。
现在,只要您滚动,第一个项目的ViewHolder
就会被回收并返回onBindViewHolder()
以设置项目的视图,它将从底部进入屏幕(假设我们有一个垂直RecyclerView
)。
在onBindViewHolder()
内,您要做的就是根据您的需要改变字段,例如:
holder.titleTextView.setText(dataSet.get(position));
见这里,无需更改holder.titleTextView
的引用,只发生变异,因此可以很容易地将其声明为final
。
答案 2 :(得分:0)
在几个不同的上下文中使用final关键字来定义 只能分配一次的实体。
一旦分配了最终变量,它总是包含相同的变量 值。如果最终变量包含对象的引用,那么 可以通过对对象的操作来改变对象的状态,但是 变量将始终引用同一个对象(此属性) 最终称为非传递性)。这也适用于数组, 因为数组是对象;如果最终变量持有引用 一个数组,然后可以改变数组的组件 对数组的操作,但变量将始终引用 相同的数组。