2

In my android project, I created Generic RecyclerView's Adapter class & Viewholder class like below,

Adapter class,

public class BaseRecyclerViewAdapter extends RecyclerView.Adapter<BaseViewHolder> {

    private ItemClickListener itemClickListener;
    private List<? extends Object> objectArrayList;
    private int layout;
    private BaseViewHolder baseViewHolder;

    public BaseRecyclerViewAdapter(int layout, ItemClickListener itemClickListener, List<? extends Object> objectArrayList) {
        this.layout = layout;
        this.itemClickListener = itemClickListener;
        this.objectArrayList = objectArrayList;
    }

    public BaseRecyclerViewAdapter(BaseViewHolder baseViewHolder, int layout,
                                   ItemClickListener itemClickListener, List<? extends Object> objectArrayList) {
        this.baseViewHolder = baseViewHolder;
        this.layout = layout;
        this.itemClickListener = itemClickListener;
        this.objectArrayList = objectArrayList;
    }

    @NonNull
    @Override
    public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
        return new BaseViewHolder(itemView, itemClickListener);
    }

    @Override
    public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {

    }

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

ViewHolder class

public class BaseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {

    private CardView cardView;
    private AppCompatImageView imgEdit;
    private AppCompatImageView imgDelete;
    private ItemClickListener itemClickListener;

    public BaseViewHolder(View itemView, ItemClickListener itemClickListener) {
        super(itemView);
        cardView = itemView.findViewById(R.id.cardView);
        imgEdit = itemView.findViewById(R.id.imgEdit);
        imgDelete = itemView.findViewById(R.id.imgDelete);
        imgDelete.setOnClickListener(this);
        cardView.setOnClickListener(this);
        cardView.setOnLongClickListener(this);
        this.itemClickListener = itemClickListener;
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == cardView.getId()) {
            itemClickListener.onClick(view, getLayoutPosition(), ConstantCodes.ACTION_CLICK);
        } else if (view.getId() == imgDelete.getId()) {
            itemClickListener.onClick(view, getLayoutPosition(), ConstantCodes.ACTION_DELETE);
        } else if (view.getId() == imgEdit.getId()) {
            itemClickListener.onClick(view, getLayoutPosition(), ConstantCodes.ACTION_EDIT);
        }
    }

    @Override
    public boolean onLongClick(View view) {
        itemClickListener.onLongClick(view, getLayoutPosition());
        return false;
    }
}

Here is the way I implement the above adapter & viewholder in my activity class

private class DispatchViewHolder extends BaseViewHolder {
    AppCompatTextView txtInvoiceNo;
    AppCompatTextView txtVehicleNo;
    AppCompatTextView txtPartyName;
    AppCompatTextView txtNoOfBags;
    AppCompatTextView txtMaterialType;
    AppCompatTextView txtWeight;

    DispatchViewHolder(View itemView, ItemClickListener itemClickListener) {
        super(itemView, itemClickListener);
    }
}


private class DispatchMaterialAdapter extends BaseRecyclerViewAdapter {

    ItemClickListener itemClickListener;
    List<? extends Object> objectArrayList;

    DispatchMaterialAdapter(ItemClickListener itemClickListener, List<? extends Object> objectArrayList) {
        super(R.layout.dispatch_material_row, itemClickListener, objectArrayList);
        this.itemClickListener = itemClickListener;
        this.objectArrayList = objectArrayList;
    }

    @NonNull
    @Override
    public DispatchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.dispatch_material_row, parent, false);
        return new DispatchViewHolder(itemView, itemClickListener);
    }

    @Override
    public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {
        try {
            DispatchViewHolder dispatchViewHolder = (DispatchViewHolder) holder;
            DispatchMaterialMd dispatchMaterialMd = (DispatchMaterialMd) objectArrayList.get(position);
            dispatchViewHolder.txtInvoiceNo.setText(dispatchMaterialMd.getInvoiceNo());
            dispatchViewHolder.txtVehicleNo.setText(dispatchMaterialMd.getVehicleNo());
            dispatchViewHolder.txtPartyName.setText(dispatchMaterialMd.getPartyName());
            dispatchViewHolder.txtNoOfBags.setText(dispatchMaterialMd.getNoOfBags());
            dispatchViewHolder.txtMaterialType.setText(dispatchMaterialMd.getMaterialType());
            dispatchViewHolder.txtWeight.setText(dispatchMaterialMd.getWeight());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

I have data in my objectArrayList list. I can print it in console, but nothing is coming in recyclerview. In recyclerview, it is only displaying empty Textview.

Following way, implement recyclerview,

layoutManager = new LinearLayoutManager(this);
dispatchMaterialAdapter =
                new DispatchMaterialAdapter(itemClickListener, dispatchMaterialMds);
            recycleListDetail.setLayoutManager(layoutManager);
            recycleListDetail.setAdapter(dispatchMaterialAdapter);

dispatchMaterialMds is an arraylist of model class which is filled from the database's data.

Can you please help me, why my data is not getting displayed ?

Bitcoin
  • 27
  • 8

4 Answers4

1

You made BaseViewHolder that did the inflation then redone it in the DispatchViewHolder not sure if this will solve the problem but there was repeated code.

private class DispatchViewHolder extends BaseViewHolder {
    AppCompatTextView txtInvoiceNo;
    AppCompatTextView txtVehicleNo;
    AppCompatTextView txtPartyName;
    AppCompatTextView txtNoOfBags;
    AppCompatTextView txtMaterialType;
    AppCompatTextView txtWeight;

    DispatchViewHolder(View itemView, ItemClickListener itemClickListener) {
        super(itemView, itemClickListener);
    }
}


private class DispatchMaterialAdapter extends BaseRecyclerViewAdapter {

    ItemClickListener itemClickListener;
    List<? extends Object> objectArrayList;

    DispatchMaterialAdapter(ItemClickListener itemClickListener, List<? extends Object> objectArrayList) {
        super(R.layout.dispatch_material_row, itemClickListener, objectArrayList);
        this.itemClickListener = itemClickListener;
        this.objectArrayList = objectArrayList;
    }

@Override
public DispatchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.dispatch_material_row, parent, false);
    return new DispatchViewHolder(itemView, itemClickListener);
}
@Override
public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {
    try {
        DispatchViewHolder dispatchViewHolder = (DispatchViewHolder) holder;
        DispatchMaterialMd dispatchMaterialMd = (DispatchMaterialMd) objectArrayList.get(position);
        dispatchViewHolder.txtInvoiceNo.setText(dispatchMaterialMd.getInvoiceNo());
        dispatchViewHolder.txtVehicleNo.setText(dispatchMaterialMd.getVehicleNo());
        dispatchViewHolder.txtPartyName.setText(dispatchMaterialMd.getPartyName());
        dispatchViewHolder.txtNoOfBags.setText(dispatchMaterialMd.getNoOfBags());
        dispatchViewHolder.txtMaterialType.setText(dispatchMaterialMd.getMaterialType());
        dispatchViewHolder.txtWeight.setText(dispatchMaterialMd.getWeight());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

In the DispatchViewHolder:

AppCompatTextView txtInvoiceNo;
AppCompatTextView txtVehicleNo;
AppCompatTextView txtPartyName;
AppCompatTextView txtNoOfBags;
AppCompatTextView txtMaterialType;
AppCompatTextView txtWeight;
DispatchViewHolder(View itemView, ItemClickListener itemClickListener) {
    super(itemView, itemClickListener);
    //Initiliazation of new view?
}
Mohammad Tabbara
  • 1,438
  • 1
  • 16
  • 31
0

make change in set adapter code like below.

        recycleListDetail.setLayoutManager(new LinearLayoutManager(this));
    dispatchMaterialAdapter =
            new DispatchMaterialAdapter(itemClickListener, dispatchMaterialMds);
    recycleListDetail.setLayoutManager(layoutManager);
    recycleListDetail.setAdapter(dispatchMaterialAdapter);
    dispatchMaterialAdapter.notifyDataSetChanged();

and also check your adapter in bind view get the arraylist value and check arraylist type in getting and passing to adapter that same or not.

  • I have data in my objectArrayList list. I can print it in console, but nothing is coming in recyclerview. In recyclerview, it is only displaying empty Textview. – Bitcoin Mar 20 '18 at 09:25
  • in adapter getItemCount() method in put objectArrayList.size(). –  Mar 20 '18 at 09:30
  • I tried that way too, but nothing is getting displayed in Textview, however, If I print the value on console, then it is working. So I think problem is somehow in Inheritance – Bitcoin Mar 20 '18 at 09:31
  • then pl give your passing list array with data into adapter then i can test it. –  Mar 20 '18 at 09:32
  • you can take any string, for e.g. TEST, forget the model class and consider it as string array – Bitcoin Mar 20 '18 at 09:34
0

above discussion i am make demo for recycler view and is wroking using simple string array.. Adapter class.

public class RecyclerViewAdpater extends RecyclerView.Adapter { List mStringList=new ArrayList<>();// hear you can pass any pojo class object. Context mContext;

public RecyclerViewAdpater(List<String> mStringList, Context mContext) {
    this.mStringList = mStringList;
    this.mContext = mContext;
}

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

@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
    String data=mStringList.get(position); // if you pass object of class then create that class object.
    holder.textView.setText(data);
 }

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

public class ItemViewHolder extends RecyclerView.ViewHolder {
    TextView textView;
    public ItemViewHolder(View itemView) {
        super(itemView);
        textView=itemView.findViewById(R.id.timeData);
    }
}

}

then implement activity like below code put in onCreate view method ...

 recyclerViewAdpater=new RecyclerViewAdpater(mStingList,this);
    mRvData.setLayoutManager(new LinearLayoutManager(this));
    mRvData.setAdapter(recyclerViewAdpater);
    chatAdapter.notifyDataSetChanged();
-1

Please try this

@Override
public int getItemCount() {
    return objectArrayList.size();
}
Saurabh Vadhva
  • 511
  • 5
  • 12
  • @Saurabh, I tried your answer, but it is not working. – Bitcoin Mar 20 '18 at 08:58
  • @SaurabhVadhva I think I understand what you meant. @Bitcoin You need to return the size of `objectArrayList` in `DispatchMaterialAdapter` class and not the size of `dispatchMaterialMds` – denvercoder9 Mar 20 '18 at 09:03
  • well if I do dispatchViewHolder.txtInvoiceNo.setText("TEST"); then also it is not printing TEST in TextView, so problem is with generic ViewHolder – Bitcoin Mar 20 '18 at 09:06