ViewHolder类中的最终属性?

时间:2017-10-30 13:21:46

标签: java android android-recyclerview android-view android-viewholder

我刚刚生成了一个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() + "'";
    }
}

3 个答案:

答案 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关键字来定义   只能分配一次的实体。

     

一旦分配了最终变量,它总是包含相同的变量   值。如果最终变量包含对象的引用,那么   可以通过对对象的操作来改变对象的状态,但是   变量将始终引用同一个对象(此属性)   最终称为非传递性)。这也适用于数组,   因为数组是对象;如果最终变量持有引用   一个数组,然后可以改变数组的组件   对数组的操作,但变量将始终引用   相同的数组。