'Should I create adapter for every recyclerview?

I am using diffutil for my recycler adapters and I need many recyclerview for categorization. Should I create adapter for every recyclerview? Same view, same type data, same functions, different data btw

enter image description here



Solution 1:[1]

If you check your recycler view's onBindViewHolder method it has your holder parameter which provides you with the instance of different ViewHolders you have and accordingly set the layout for the recycler view. For example, in my case I had to use a single recyclerView adapter to create an instance Income as well as expense in a list.

This is how my onBindViewHolder looks:

@Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

    DialogDetails d=new DialogDetails();

    if (holder instanceof IncomeListHolder){
        ((IncomeListHolder)holder).categoryText.setText(expensesList.get(position).getCategory());
        ((IncomeListHolder)holder).incomeText.setText("+"+expensesList.get(position).getAmount());
        ((IncomeListHolder)holder).incomeText.setTextColor(context.getResources().getColor(R.color.income_color));


    }

    if (holder instanceof ExpensesListHolder){
        ((ExpensesListHolder) holder).category.setText(list.get(position-expensesList.size()).getCategory());
        ((ExpensesListHolder) holder).expenseText.setText("-"+list.get(position- expensesList.size()).getExpense());
        ((ExpensesListHolder) holder).expenseText.setTextColor(context.getResources().getColor(R.color.expense_color));
    }







    //.setText(String.valueOf(balanceList.get(position).getIncome()));


}

You also have to create separate viewHolders for all the list data you wish to display,like:

  public class IncomeListHolder extends RecyclerView.ViewHolder {
        TextView categoryText;
        TextView incomeText;

    public IncomeListHolder(@NonNull View itemView) {
        super(itemView);

        categoryText=itemView.findViewById(R.id.main_category_text_view);
        incomeText=itemView.findViewById(R.id.expenses_text_view);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position=getAdapterPosition();
               if (listener!=null && position!=RecyclerView.NO_POSITION){
                   listener.getIncomeData(expensesList.get(position),view);
                  details.setUpdate(true);
               }
            }
        });
    }
}

public class ExpensesListHolder extends RecyclerView.ViewHolder{

     TextView category;
     TextView expenseText;
    public ExpensesListHolder(@NonNull View itemView) {
        super(itemView);

        category=itemView.findViewById(R.id.main_category_text_view_2);
        expenseText=itemView.findViewById(R.id.expenses_text_view_2);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position=getAdapterPosition();
                if (listener!=null && position!=RecyclerView.NO_POSITION){
                    listener.getExpenseData(list.get(position-expensesList.size()),view);
                    details.setUpdate(true);
                }
            }
        });
    }
}

My whole recycler view adapter:

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

        final int VIEW_TYPE_INCOME=0;
        final int VIEW_TYPE_EXPENSE=1;
        View view;
        List<DataBaseEntity> expensesList=new ArrayList<>();
        List<ExpenseDataEntity> list=new ArrayList<>();
        Context context;
        OnItemClickListener listener;
        DialogDetails details=new DialogDetails();


     public IncomeListAdapter(Context context) {
         this.context = context;
     }
//
//         View v=LayoutInflater.from(context).inflate(R.layout.fragment_expense_home,null);
////          t=v.findViewById(R.id.income_text_view);
//     }


    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

         if (viewType==VIEW_TYPE_INCOME) {
             view = LayoutInflater.from(parent.getContext()).inflate(R.layout.expenses_list, parent, false);
             return new IncomeListHolder(view);
         }

         if (viewType==VIEW_TYPE_EXPENSE){
             view=LayoutInflater.from(parent.getContext()).inflate(R.layout.expense_layout_list,parent,false);
             return new ExpensesListHolder(view);
         }



        return null;
    }

    public interface OnItemClickListener{
        void getIncomeData(DataBaseEntity dataBaseEntity,View view);
        void getExpenseData(ExpenseDataEntity expenseDataEntity,View view);

    }

    public void setOnItemClickListener(OnItemClickListener listener){
         this.listener=listener;
    }






    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

        DialogDetails d=new DialogDetails();

        if (holder instanceof IncomeListHolder){
            ((IncomeListHolder)holder).categoryText.setText(expensesList.get(position).getCategory());
            ((IncomeListHolder)holder).incomeText.setText("+"+expensesList.get(position).getAmount());
            ((IncomeListHolder)holder).incomeText.setTextColor(context.getResources().getColor(R.color.income_color));


        }

        if (holder instanceof ExpensesListHolder){
            ((ExpensesListHolder) holder).category.setText(list.get(position-expensesList.size()).getCategory());
            ((ExpensesListHolder) holder).expenseText.setText("-"+list.get(position- expensesList.size()).getExpense());
            ((ExpensesListHolder) holder).expenseText.setTextColor(context.getResources().getColor(R.color.expense_color));
        }







        //.setText(String.valueOf(balanceList.get(position).getIncome()));


    }

    public DataBaseEntity getDataAt(int position){
         return expensesList.get(position);
    }

    public ExpenseDataEntity getExpenseAt(int position){
         return list.get(position- expensesList.size());
    }

    @Override
    public int getItemCount() {
        return expensesList.size()+list.size();
    }

    @Override
    public int getItemViewType(int position) {


        if (position< expensesList.size()){
            return VIEW_TYPE_INCOME;
        }

        if (position-expensesList.size()< list.size()){
            return VIEW_TYPE_EXPENSE;
        }

        return -1;
    }

    public void setExpensesList(List<DataBaseEntity> expensesList){
        this.expensesList=expensesList;
        notifyDataSetChanged();
    }

    public void setList(List<ExpenseDataEntity> list){
         this.list=list;
         notifyDataSetChanged();
    }
//    public void setBalanceList(List<BalanceSheetEntity> balanceList){
//        this.balanceList=balanceList;
//        notifyDataSetChanged();
//    }

    public class IncomeListHolder extends RecyclerView.ViewHolder {
            TextView categoryText;
            TextView incomeText;

        public IncomeListHolder(@NonNull View itemView) {
            super(itemView);

            categoryText=itemView.findViewById(R.id.main_category_text_view);
            incomeText=itemView.findViewById(R.id.expenses_text_view);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int position=getAdapterPosition();
                   if (listener!=null && position!=RecyclerView.NO_POSITION){
                       listener.getIncomeData(expensesList.get(position),view);
                      details.setUpdate(true);
                   }
                }
            });
        }
    }

    public class ExpensesListHolder extends RecyclerView.ViewHolder{

         TextView category;
         TextView expenseText;
        public ExpensesListHolder(@NonNull View itemView) {
            super(itemView);

            category=itemView.findViewById(R.id.main_category_text_view_2);
            expenseText=itemView.findViewById(R.id.expenses_text_view_2);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int position=getAdapterPosition();
                    if (listener!=null && position!=RecyclerView.NO_POSITION){
                        listener.getExpenseData(list.get(position-expensesList.size()),view);
                        details.setUpdate(true);
                    }
                }
            });
        }
    }


}

Solution 2:[2]

With promises you can achieve it as follows

const data = () => {
    return MyModel.find({});   
}

// using it in another function 
const result = await data();

Solution 3:[3]

1.You can use a callback, as below

const data = (callback) =>
{
    MyModel.find().then(function(result){
        console.log(result);
        //return(result);
        callback(results);//we pass in a function which will be used to pull out 
        //data
    });
}

exports.data = data

// THE AREA WHERE THIS CODE IS USED

const {data} = require('./to/data')

//show data 
 data(function (result) {
 console.log( result );// data from callback
 })

2. using async/await promies

const data = async () =>
{
   let results = await MyModel.find();
}
exports.data = data

ON USING THIS FUNCTION

const {data} = require('./to/data')

(async function () {
    let res = await data();
    console.log(res);
})()

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Puneet Shetty
Solution 2 Eduard
Solution 3 ndotie