Sergey Kovalev
Sergey Kovalev

Reputation: 3

RecyclerView Adapter don't see ViewHolder

I'm trying to develop a project in accordance with MVP standarts. In the guide i followed, author created separate ViewHolder class. I tried to do the same, but Adapter refuses to work with separate ViewHolder.

There is 2 errors

Cannot resolve symbol 'LessonCardView'

'onCreateViewHolder(ViewGroup, int)' in RVAdapter clashes with 'onCreateViewHolder(ViewGroup, int)' in 'android.support.v7.widget.RecyclerView.Adapter'; attempting to use incompatible return type

RVAdapter.java

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.LessonCardViewHolder> {

    private String[] mDataset;

    public RVAdapter(String[] dataset) {
        mDataset = dataset;
    }

    @Override
    public LessonCardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new LessonCardViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.lessons_item_card, parent, false));
    }

    @Override
    public void onBindViewHolder(LessonCardViewHolder holder, int position) {
    
    }

    @Override
    public int getItemCount() {
        return mDataset.length;
    }
}

LessonCardViewHolcer.java

public class LessonCardViewHolder extends RecyclerView.ViewHolder implements LessonCardView {

    private final TextView lessonCardText;

    public LessonCardViewHolder(View itemView) {
        super(itemView);
        lessonCardText = (TextView) itemView.findViewById(R.id.lesson_card_view);
    }

    @Override
    public void setLessonCardText(String text) {
        lessonCardText.setText(text);
    }
}

I created subclass ViewHolder that inherited from LessonCardView in RVAdapter. Errors disappeared. But i'm not sure if this the right way. If it works for someone else, then i'm doing something wrong.

Upvotes: 0

Views: 2484

Answers (4)

Akshay
Akshay

Reputation: 318

Here is the complete solution - Recyclerview Adapter class example

public class IAdapter extends RecyclerView.Adapter<IAdapter.ViewHolder> {


Context context;
ArrayList<Model> modelList;


public ImagesAdapter(Context context,ArrayList<Model> modelList) {
    this.context=context;
    this.modelList=modelList;
}

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

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
        Model model=photo.get(position);
        userViewHolder.textView.setText(model.getTitle());

}

public class ViewHolder extends RecyclerView.ViewHolder{

    TextView textView;
    public ViewHolderImages(View itemView) {
        super(itemView);
        textView=(TextView)itemView.findViewById(R.id.textView);
    }
}

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

}

Upvotes: 0

Marina Ž
Marina Ž

Reputation: 1

LessonCardViewHolder should be a nested class in RVAdapter

Upvotes: 0

Submersed
Submersed

Reputation: 8870

It looks like from how you're providing the snippets that these classes are in different files, or not correctly nested within the same file.

Have you tried using RecyclerView.Adapter<LessonCardViewHolder> rather than RecyclerView.Adapter<RVAdapter.LessonCardViewHolder>?

Upvotes: 0

Bakhtiyor Begmatov
Bakhtiyor Begmatov

Reputation: 483

Change your adapter declaration from this

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.LessonCardViewHolder> {

to this

// import here your view holder

public class RVAdapter extends RecyclerView.Adapter<LessonCardViewHolder> {

Upvotes: 1

Related Questions