RecyclerView.Adapter看不到重写的onBindViewHolder方法?

11

我在我的项目中使用DataBindings和RecyclerView。 我有一个RecyclerView的基础适配器。它看起来像这样:

public abstract class BaseAdapter<T extends ViewDataBinding> extends RecyclerView.Adapter<BaseAdapter.ViewHolder> {

    public BaseAdapter() {}

    public class ViewHolder extends RecyclerView.ViewHolder {

        public T binding;

        public ViewHolder(View view) {
            super(view);
            binding = DataBindingUtil.bind(view);
        }
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        ... code ...
        }

}

ViewHolder 扩展类仅在绑定字段类型上有所不同。实现扩展 BaseAdapter 类后:

public class BaseAdapterExtended extends BaseAdapter<BaseAdapterExtendedBinding> {

    public BaseAdapterExtended(ArrayList<ItemModel> itemModels) {
        super();
        mData = itemModels;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        return new ViewHolder(BaseAdapterExtendedBinding.inflate(inflater, parent, false).getRoot());
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        super.onBindViewHolder(holder, position);
    }

    @Override
    protected View getItemRootView(ViewHolder holder) {
        return holder.binding.item;
    }

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

我收到了下一个编译错误:

我遇到了下一个编译错误:

error: BaseAdapterExtended is not abstract and does not override abstract method onBindViewHolder(BaseAdapter.ViewHolder,int) in Adapter

似乎BaseAdapterExtended没有这个方法,但它确实存在。 如果我改变

public void onBindViewHolder(ViewHolder holder, int position)

to

public void onBindViewHolder(BaseAdapter.ViewHolder holder, int position)

投影编译成功,但类型绑定将是 ViewDataBinding 而不是 BaseAdapterExtendedBinding。为什么会这样?有什么想法吗?

BaseAdapterExtended 中,ViewHolder 的导入是什么意思?为什么在 BaseAdapterExtended 中需要一个名为 GamesListAdapter 的构造函数? - Blackbelt
抱歉,我正在重命名对象。 - Tiberal
你解决了你的问题吗?我现在已经遇到这个问题整整一周了,让我感到非常烦恼 :-/ - Strassenrenner
请为我工作:http://pastebin.com/t7JcMQU2 - Tiberal
你能解决它吗? - Sush
4个回答

27

在我的情况下,我忘记对我的超类进行参数化。在创建类时,我还没有创建ViewHolder,它是非常宽松的,除了该方法的错误之外。也就是说:

public class FooAdapter extends RecyclerView.Adapter {

必须更改为

public class FooAdapter extends RecyclerView.Adapter<FooAdapter.FooViewHolder> {

这本来就需要完成,但我只在onBindViewHolder中得到了编译器错误。


7

在这行代码中:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    super.onBindViewHolder(holder, position);
}

ViewHolder 替换为 BaseAdapterExtended.ViewHolder


2

我刚刚找到了这个奇怪问题的原因。我的项目也出现了这个问题,但只发生在参数化的适配器上,就像你的一样。所有其他适配器都可以在不需要显式指定ViewHolder类的情况下看到BindViewHolder()方法。解决方案是使用任意随机参数类型对ViewHolder类进行参数化,这似乎是一个错误。

public abstract class BaseAdapter<T extends ViewDataBinding> extends RecyclerView.Adapter<BaseAdapter.ViewHolder> {

public BaseAdapter() {}

public class ViewHolder<RandomTypeNotUsed> extends RecyclerView.ViewHolder {

    public T binding;

    public ViewHolder(View view) {
        super(view);
        binding = DataBindingUtil.bind(view);
    }
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    ... code ...
    }

}


1

对我来说运行良好! //像是我的ImageView

@Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int i) {
        MyViewHolder myViewHolder1 = (MyViewHolder)viewHolder;
        myViewHolder1.like.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "yay" + i, Toast.LENGTH_SHORT ).show();
            }
        });
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接