Java ViewHolder类中的最终属性?

Java ViewHolder类中的最终属性?,java,android,android-recyclerview,android-view,android-viewholder,Java,Android,Android Recyclerview,Android View,Android Viewholder,我刚刚生成了一个Master/detailflow项目,我发现了一些奇怪的东西:在driverstactivity.java中,名为ViewHolder的子类具有final属性。由于ViewHolder中的数据可能需要更换, 为什么属性设置为final public class ViewHolder extends RecyclerView.ViewHolder { public final View mView; //??????? public final TextView

我刚刚生成了一个
Master/detailflow
项目,我发现了一些奇怪的东西:在
driverstactivity.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() + "'";
    }
}

Final并不意味着对象不能被变异。Final表示引用本身不能被替换。您仍然可以对最终引用调用mIdView.setText()


就像在C中一样,有一个指针(一个引用)和一个值。Final表示指针是不可更改的,而不是它所指向的值。一旦创建,ViewHolder将不会更改其内部视图的值-这就是我们使用ViewHolder模式的原因-这些引用是恒定的。

RecyclerView
将创建数量有限的特定
ViewHolder
。例如,在您的数据集中有100个类似的项目并不意味着您将创建100个
ViewHolder
s。要填充屏幕视口,大约需要多少
ViewHolder
s,比如说10个项目

现在,只要您滚动,屏幕外的第一个项目的
ViewHolder
将被回收并返回给
onBindViewHolder()
,以便为项目设置视图,该项目将从底部进入屏幕(假设我们有一个垂直的
RecyclerView

onBindViewHolder()
中,您要做的就是根据您的需要更改字段,例如:

holder.titleTextView.setText(dataSet.get(position));
如图所示,无需更改holder.titleTextView的引用,仅发生变异,因此可以轻松声明为
final

最后一个关键字在几个不同的上下文中用于定义 只能分配一次的实体

一旦分配了最终变量,它总是包含相同的变量 价值如果最终变量包含对对象的引用,则 对象的状态可以通过对对象的操作来更改,但是 变量将始终引用同一对象(的此属性 final称为非及物性(non-transitivity)。这也适用于阵列, 因为数组是对象;如果最终变量包含对的引用 一个数组,则可以通过 操作,但变量将始终引用 相同的数组