Search code examples
javaandroidlistviewandroid-recyclerviewadapter

Reuse the RecyclerView adapter


I have very small question here, in my recycle view adapter class i'm using List<FeaturedTags> and its working fine.

Now we have newly introduced class called 'FeaturedLangTags, the only difference between FeaturedTags & FeaturedLangTagsis just an addition of Lang field. But we are not using this Lang field anyway to show on screen.

The output of the recycle view looks exactly similar to existing FeaturedTags adapter. Here i want to know how i can re-use the existing adapter class to display List<FeaturedLangTags> items?

One simple way is to duplicate the existing adapter and pass the FeaturedLangTagslist, but here so much of code is getting duplicated. I would like to know how i can tweek the existing class?


Solution

  • Create Adapter of generic List<T> which can be used in both condition.

    public abstract class GenericAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    
        private Context context;
        private ArrayList<T> items;
    
        public abstract RecyclerView.ViewHolder setViewHolder(ViewGroup parent);
    
        public abstract void onBindData(RecyclerView.ViewHolder holder, T val);
    
        public GenericAdapter(Context context, ArrayList<T> items){
            this.context = context;
            this.items = items;
        }
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            RecyclerView.ViewHolder holder = setViewHolder(parent);
            return holder;
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            onBindData(holder,items.get(position));
        }
    
        @Override
        public int getItemCount() {
            return items.size();
        }
    
        public void addItems( ArrayList<T> savedCardItemz){
            items = savedCardItemz;
            this.notifyDataSetChanged();
        }
    
        public T getItem(int position){
            return items.get(position);
        }
    }
    
    
    adapter = new GenericAdapter<DataModel>(context,modelList) {
            @Override
            public RecyclerView.ViewHolder setViewHolder(ViewGroup parent) {
                final View view =            LayoutInflater.from(context).inflate(R.layout.item_view_holder, parent, false);
                ItemViewHolder viewHolder = new ItemViewHolder(context, view);
                return viewHolder;
            }
    
            @Override
            public void onBindData(RecyclerView.ViewHolder holder1, DataModel val) {
                    DataModel userModel = val;
    
                    ItemViewHolder holder = (ItemViewHolder)holder1;
                    holder.name.setText(userModel.getName());
                    holder.fatherName.setText(userModel.getFatherName());
            }
        };
        mRecyclerView.setAdapter(adapter);