简体   繁体   English

为什么我们要声明 ViewHolder 类是静态的?

[英]Why should we declare the ViewHolder class static?

I have the following RecyclerViewAdapter class.我有以下 RecyclerViewAdapter 类。 What's weird about the following code is if I don't declare the ViewHolder class static, I get the following error:以下代码的奇怪之处在于,如果我不将 ViewHolder 类声明为静态,则会出现以下错误:

Error:(24, 8) error: MaterialRequiredListRecyclerViewAdapter is not abstract and does not override abstract method onBindViewHolder(MaterialRequiredListRecyclerViewAdapter.MaterialRequiredRecyclerViewHolder,int) in Adapter

However as soon as I declare this class static, the error goes away.但是,一旦我将此类声明为静态,错误就会消失。

I know that declaring the ViewHolder class enforces the prevention of memory leaks by not allowing the inner class use the member variables of the outer class or expose it's own instance to other classes, however I don't understand the reason for the above mentioned error.我知道声明 ViewHolder 类通过不允许内部类使用外部类的成员变量或将它自己的实例暴露给其他类来强制防止内存泄漏,但是我不明白上述错误的原因。

Code:代码:

public class MaterialRequiredListRecyclerViewAdapter<T> extends RecyclerView.Adapter<MaterialRequiredListRecyclerViewAdapter.MaterialRequiredRecyclerViewHolder> {

    private int mLayoutFileId;
    private List<String> mMaterialRequiredDataList;
    private Context mContext;

    public MaterialRequiredListRecyclerViewAdapter(Context con, int layoutFileId, List materialRequiredList) {
        mContext = con;
        mLayoutFileId = layoutFileId;
        mMaterialRequiredDataList = materialRequiredList;
    }

    @Override
    public MaterialRequiredRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.
                from(parent.getContext()).
                inflate(mLayoutFileId, parent, false);//R.layout.layout_cardview_apointments_for_video_call_frag

        return new MaterialRequiredRecyclerViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MaterialRequiredRecyclerViewHolder holder, int position) {
        if(mMaterialRequiredDataList != null)
            holder.mMaterialRequiredTV.setText(mMaterialRequiredDataList.get(position));
    }

    @Override
    public int getItemCount() {
        return mMaterialRequiredDataList.size();
    }

    public class MaterialRequiredRecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        @BindView(R.id.text_view_list_cell)
        TextView mMaterialRequiredTV;

        public MaterialRequiredRecyclerViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }

        @Override
        public void onClick(View v) {

        }
    }
}

If your question is just this:如果您的问题只是这样:

I don't understand the reason for the above mentioned error.我不明白上述错误的原因。

Then the answer is that making the view holder class static makes it accessible from anywhere, whereas making it non-static makes it inaccessible with just its name reference like MaterialRequiredRecyclerViewHolder holder .那么答案是,将视图持有者类设为静态使其可从任何地方访问,而将其设为非静态则使其无法仅通过其名称引用(如MaterialRequiredRecyclerViewHolder holder If you want to keep it non-static, just change the following lines in your adapter:如果您想保持非静态,只需更改适配器中的以下几行:

@Override
public void onBindViewHolder(MaterialRequiredRecyclerViewHolder holder, int position) {
    if(mMaterialRequiredDataList != null)
        holder.mMaterialRequiredTV.setText(mMaterialRequiredDataList.get(position));
}

to this:对此:

@Override
public void onBindViewHolder(MaterialRequiredListRecyclerViewAdapter.MaterialRequiredRecyclerViewHolder holder, int position) {
    if(mMaterialRequiredDataList != null)
        holder.mMaterialRequiredTV.setText(mMaterialRequiredDataList.get(position));
}

The call to the non-static inner class should be through a reference to the outer class.对非静态内部类的调用应该通过对外部类的引用。 I'm sorry for my bad English, but I hope I could explain.我很抱歉我的英语不好,但我希望我能解释一下。

You have to make all methods in view holder class public.您必须将视图持有者类中的所有方法设为公开。 It has to be accessed in the adapter class.它必须在适配器类中访问。 The error goes if u make it public.如果你把它公开,错误就会发生。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM