Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建具有扩展另一个类并实现接口的类型参数的基本适配器?_Java_Android_Generics - Fatal编程技术网

Java 如何创建具有扩展另一个类并实现接口的类型参数的基本适配器?

Java 如何创建具有扩展另一个类并实现接口的类型参数的基本适配器?,java,android,generics,Java,Android,Generics,我已经看到了这个问题的答案 Java:如何创建需要扩展类并实现接口的数据类型的泛型类 因此,我尝试为recyclerview创建一个基本适配器。这是基本适配器的完整代码: class BaseAdapter<T extends SugarRecord & ModelInterface> extends RecyclerView.Adapter<BaseAdapter.ViewHolder> { protected SparseArray<T>

我已经看到了这个问题的答案

Java:如何创建需要扩展类并实现接口的数据类型的泛型类

因此,我尝试为recyclerview创建一个基本适配器。这是基本适配器的完整代码:

class BaseAdapter<T extends SugarRecord & ModelInterface> extends RecyclerView.Adapter<BaseAdapter.ViewHolder> {

    protected SparseArray<T> modelSparseArray;
    protected Context context;

    private int backgroundResource;



    public BaseAdapter(SparseArray<T> modelSparseArray, Context context) {
        this.modelSparseArray = modelSparseArray;
        this.context = context;
        setupBackgroundResource(context);
    }

    private void setupBackgroundResource(Context context){
        TypedValue typedValue = new TypedValue();
        context.getTheme().resolveAttribute(R.attr.selectableItemBackground, typedValue, true);
        backgroundResource = typedValue.resourceId;
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

        @Bind(R.id.done_indicator)
        CheckBox doneIndicator;

        @Bind(R.id.title)
        TextView title;

        View view;

        public ViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
            view = itemView;
        }
    }

    public void addModel(T model){
        int key = model.getId().intValue();
        int index = modelSparseArray.indexOfKey(key);
        modelSparseArray.append(key, model);
        if(key < 0)
            notifyItemInserted(modelSparseArray.size());
        else
            notifyItemChanged(index);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.row_layout, parent, false);
        view.setBackgroundResource(backgroundResource);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        final T model = modelSparseArray.valueAt(position);
        holder.title.setText(model.getTitle());
        holder.doneIndicator.setChecked(model.isDone());
        holder.doneIndicator.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                model.setDone(isChecked);
                model.save();
            }
        });
    }



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

第一个错误指向类声明的开头,第二个错误指向onBindViewHolder上面的覆盖

,因此我一发布问题就发现了答案,我将发布此消息,以防任何人需要答案:

将RecyclerView.Adapter更改为RecyclerView.Adapter

我最初创建的基本适配器没有类型参数,因此它可以与RecyclerView.adapter一起使用,但是在添加类型参数之后,我还需要添加


另一个解决方案是按照@chRyNaN的建议将内部视图保持为静态。

所以我一发布问题就发现了答案,我会发布此消息,以防任何人需要答案:

将RecyclerView.Adapter更改为RecyclerView.Adapter

我最初创建的基本适配器没有类型参数,因此它可以与RecyclerView.adapter一起使用,但是在添加类型参数之后,我还需要添加


另一个解决方案是按照@chRyNaN的建议将内部ViewHolder设置为静态。

您的内部ViewHolder类不是静态的,但您正在引用它。请尝试删除静态引用。@chRyNaN我将用您的建议更新我的答案您的内部ViewHolder类不是静态的,但您正在引用它。尝试删除静态引用。@chRyNaN我将用您的建议更新我的答案。正确!你救了我!谢谢,我已经用这个勒死了好几个小时了,对吗!你救了我!谢谢,我已经用这个勒死了好几个小时了
Error:(24, 1) error: BaseAdapter is not abstract and does not override abstract method onBindViewHolder(BaseAdapter.ViewHolder,int) in Adapter
Error:(80, 5) error: method does not override or implement a method from a supertype