简体   繁体   English

使用通用适配器和Viewholder时,Recyclerview不显示数据

[英]Recyclerview is not displaying data when using generic adapter & viewholder

In my android project, I created Generic RecyclerView's Adapter class & Viewholder class like below, 在我的Android项目中,我创建了通用RecyclerView的Adapter类和Viewholder类,如下所示,

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 ViewHolder类

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. 我的objectArrayList列表中有数据。 I can print it in console, but nothing is coming in recyclerview. 我可以在控制台中打印它,但是recyclerview中什么都没有。 In recyclerview, it is only displaying empty Textview. 在recyclerview中,它仅显示空的Textview。

Following way, implement recyclerview, 按照以下方式,实施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. dispatchMaterialMds是模型类的数组列表,该列表由数据库的数据填充。

Can you please help me, why my data is not getting displayed ? 您能不能帮我,为什么我的数据没有显示?

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. 您使执行充气的BaseViewHolder然后在DispatchViewHolder中重做它,不确定是否能解决问题,但是重复了代码。

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: 在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?
}

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. 并在绑定视图中检查适配器,以获取arraylist值,并在获取和传递给适配器时检查arraylist类型是否相同。

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. 公共类RecyclerViewAdpater扩展了RecyclerView.Adapter {List mStringList = new ArrayList <>(); //听说您可以传递任何pojo类对象。 Context mContext; 上下文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 ... 然后实现如下活动,将以下代码放入onCreate视图方法中...

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

Please try this 请尝试这个

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM