【问题标题】:Recyclerview is not displaying data when using generic adapter & viewholder使用通用适配器和查看器时,Recyclerview 不显示数据
【发布时间】:2018-03-20 08:49:50
【问题描述】:

在我的 android 项目中,我创建了 Generic RecyclerView 的 Adapter 类和 Viewholder 类,如下所示,

适配器类,

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 类

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;
    }
}

这是我在我的活动类中实现上述适配器和视图的方式

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();
    }
}

我的 objectArrayList 列表中有数据。我可以在控制台中打印它,但 recyclerview 没有任何内容。在 recyclerview 中,它只显示空的 Textview。

按照方式,实现recyclerview,

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

dispatchMaterialMds 是一个模型类的数组列表,由数据库数据填充。

你能帮帮我吗,为什么我的数据没有显示出来?

【问题讨论】:

  • 而不是 this.objectArrayList = objectArrayList;请使用 addAll() 方法 this.objectArrayList.addAll(objectArrayList);
  • @SaurabhVadhva,但我能够从 objectArrayList 获取数据,实际问题有所不同
  • 请检查我的代码。
  • 你为RecyclerView添加了一个LayoutManager吗?
  • @SamuraiSong,请检查我问题的最后一个代码块。我做到了。

标签: java android android-recyclerview android-arrayadapter android-viewholder


【解决方案1】:

您制作了 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();
        }
    }
}

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

【讨论】:

  • 在上面的代码中,你只是删除了 onCreateViewHolder() 方法吧?其余代码和我的一样,我试过你的方法,但什么也没发生:(
  • 我添加了一些其他内容,我注意到 Dispatch View Holder 没有初始化 txtInvoiceNo 和其他新的 TextViews
  • 知道了,我的代码中没有执行初始化。
  • 但是我需要重写 OnCreateViewHolder() 方法,否则它不起作用。
  • 我添加了 onCreateViewHolder 以防其他人遇到类似情况。
【解决方案2】:

更改设置的适配器代码,如下所示。

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

并在绑定视图中检查您的适配器,获取 arraylist 值并检查 arraylist 类型以获取和传递给适配器是否相同。

【讨论】:

  • 我的 objectArrayList 列表中有数据。我可以在控制台中打印它,但 recyclerview 没有任何内容。在recyclerview中,它只显示空的Textview。
  • 在适配器getItemCount()方法中放入objectArrayList.size()。
  • 我也尝试过这种方式,但是 Textview 中没有显示任何内容,但是,如果我在控制台上打印该值,则它可以正常工作。所以我认为问题出在继承
  • 然后请给你传递的列表数组和数据到适配器然后我可以测试它。
  • 你可以使用任何字符串,例如测试,忘记模型类并将其视为字符串数组
【解决方案3】:

在上面的讨论中,我正在为回收器视图制作演示,并且正在使用简单的字符串数组进行工作。 适配器类。

公共类 RecyclerViewAdpater 扩展 RecyclerView.Adapter { List mStringList=new ArrayList();// 听说你可以传递任何 pojo 类对象。 上下文 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);
    }
}

}

然后在 onCreate 视图方法中实现如下代码的活动...

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

【讨论】:

  • 请检查我的问题的通用适配器,我在实现时不使用RecyclerView.Adapter
  • 你是萨法拉兹吗?
【解决方案4】:

请试试这个

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

【讨论】:

  • @Saurabh,我试过你的答案,但它不起作用。
  • @SaurabhVadhva 我想我明白你的意思。 @Bitcoin 您需要在DispatchMaterialAdapter 类中返回objectArrayList 的大小,而不是dispatchMaterialMds 的大小
  • 好吧,如果我这样做 dispatchViewHolder.txtInvoiceNo.setText("TEST");然后它也没有在 TextView 中打印 TEST,所以问题出在通用 ViewHolder
猜你喜欢
  • 2018-05-29
  • 2021-12-07
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2020-07-02
  • 1970-01-01
  • 2016-02-15
相关资源
最近更新 更多