Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RecyclerView generic adapter

Trying to create a generic adapter for the RecyclerView.
Already explored other solutions: RecyclerView generic adapter with DataBinding
Add click listener to Generic RecyclerView Adapter
https://github.com/ravirupareliya/Recyclerview-Generic-Adapter/blob/master/app/src/main/java/com/rrr/genericrecyclerview/adapter/RecyclerAdapter.java

However want to implement it in a bit different way.
Here is how my adapter looks like:

public abstract class GenericAdapter<T> extends RecyclerView.Adapter<BaseHolder<T>> {

    private OnRecyclerItemClickListener mListener;
    private List<T> mItems;
    private final LayoutInflater mLayoutInflater;

    public GenericAdapter(Context context) {
        mLayoutInflater =
                (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mItems = Collections.emptyList();
    }

    @Override
    public BaseHolder<T> onCreateViewHolder(ViewGroup parent, int viewType) {
        // assume that viewType is a resource id returned by getItemViewType 
        // also other solutions are welcome
        View view = mLayoutInflater.inflate(viewType, parent, false);

        // TODO: how to create the view holder ??
    }

    @Override
    public void onBindViewHolder(BaseHolder<T> holder, int position) {
        T item = mItems.get(position);
        holder.onBind(item, mListener);
    }

    @Override
    public int getItemCount() {
        return mItems != null ? mItems.size() : 0;
    }  

    public void setItems(List<T> items) {
        mItems = items;
        notifyDataSetChanged();
    }

    public void setItemClickListener(OnRecyclerItemClickListener listener) {
        mListener = listener;
    }
}

This is a base view holder from which I want to extend all other holders:

public abstract class BaseHolder<T> extends RecyclerView.ViewHolder {

    public BaseHolder(View itemView) {
        super(itemView);
    }

    public abstract void onBind(T item, OnRecyclerItemClickListener listener);
}

The problem is in onCreateViewHolder method.
How do I create the view holder?
Should I somehow implement abstract BaseHolder or should I somehow change the adapter class declaration extends i.e. instead BaseHolder here RecyclerView.Adapter> should be some generic implementation of BaseHolder? I tried > but it doesn't work

Thanks in advance for any piece of advice

like image 462
Leonid Ustenko Avatar asked Jun 04 '26 20:06

Leonid Ustenko


1 Answers

P.S. It's been a long time, but if someone is interested,
at the time I solved it and published in a Generic RecyclerView Adapter library.
It finally makes it quite easy to create adapters.
I am still using it in multiple production projects.

EDIT: So the adapter finally looks like:

public abstract class GenericRecyclerViewAdapter<T, L extends BaseRecyclerListener, VH extends BaseViewHolder<T, L>> extends RecyclerView.Adapter<VH> {

    @Override
    public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);
       
    // ...
}

Thus, ViewHolder creation is delegated to the adapter implementation, i.e.:

public class SimpleAdapter extends GenericRecyclerViewAdapter<User, OnRecyclerItemClickListener, UserViewHolder> {
    
    // ...

    @Override
    public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // or return here any specific ViewHolder according to the viewType
        return new UserViewHolder(inflate(R.layout.item_user, parent), getListener());
    }
}

And the ViewHolder is a:

public abstract class BaseViewHolder<T, L extends BaseRecyclerListener> extends RecyclerView.ViewHolder {
   // ...
}
like image 103
Leonid Ustenko Avatar answered Jun 07 '26 23:06

Leonid Ustenko