【问题标题】:Recyclerview not showing items?Recyclerview 不显示项目?
【发布时间】:2019-10-14 03:19:06
【问题描述】:

我想在RecyclerView 上显示下面的布局。此布局根据商店的数量重复。假设我们有 2 家商店,那么用户将看到这两种布局,具有不同的商店名称。

适配器类:

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


    private Context context;
    LayoutInflater layoutInflater;
    List<Object> objects;
    private LayoutInflater inflater;
    private CallbackListener.SimpleCallback listener;

    public DeliverySlotsAdapter(Context context, List<Object> objects) {
        this.context = context;
        this.objects = objects;
        this.inflater = LayoutInflater.from(context);
    }

    public void setListener(CallbackListener.SimpleCallback listener) {
        this.listener = listener;
    }

    @Override
    public ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
        RecyclerView.ViewHolder viewHolder;
        View view= inflater.inflate(R.layout.item_checkout_delivery_slots, parent, false);
        return  new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        holder.bind(objects.get(position));

    }

    @Override
    public int getItemCount() {
        return objects.size() != 0 ? objects.size() : 0;
    }

    class ViewHolder extends RecyclerView.ViewHolder {
//        @BindView(R.id.rlSchedule)
//        RelativeLayout rlSchedule;
        @BindView(R.id.tvDeliveryScheduleLabel)
        TextView tvDeliveryScheduleLabel;
//        @BindView(R.id.tvDeliverySchedule)
//        TextView tvDeliverySchedule;

        public ViewHolder(View itemView) {
            super(itemView);

            itemView.setOnClickListener(v -> {
                if (listener!=null && getAdapterPosition() != RecyclerView.NO_POSITION) {
                    listener.onItemClick(objects.get(getAdapterPosition()));
                }
            });
        }

        public void bind(Object object){
            DeliverySlotItem deliverySlotItem = (DeliverySlotItem) object;
//            DeliverySlotItem item = new DeliverySlotItem();
//            Log.e("", "adfdfsf" + object);
//            tvDeliveryScheduleLabel.setText(item.shop_name);
            tvDeliveryScheduleLabel.setText(deliverySlotItem.shop_name + " Delivery");
        }

    }

}

tvDeliveryScheduleLabel 正在获取商店名称,但使用以下代码,它返回 null:

tvDeliveryScheduleLabel.setText(deliverySlotItem.shop_name + "Delivery");

这就是我获取值的方式。

Entity area = new Gson().fromJson(Preferences.getString(Prefkey.selected_area), Entity.class);
        this.controller.getItems(area.id, new CallbackListener.MultiEntityListener() {
            @Override
            public void onSuccess(List<Object> data, List<Object> included) {

                List<Entity> include = AppUtil.cast(included);
                List<Entity> shops = AppUtil.getEntitiesByType("shops", include);


                for (Entity shop : shops) {
                    DeliverySlotItem deliverySlotItem = new DeliverySlotItem();
                    deliverySlotItem.shop_name = shop.attributes.name;
                    Preferences.setString(Prefkey.selected_shop, shop.toString());
                    objects.add(deliverySlotItem);
                    deliverySlotItems.add(deliverySlotItem);

                }
            }

            @Override
            public void onFailed(Object object) {

            }
        });

        deliverySlotsAdapter = new DeliverySlotsAdapter(CheckoutActivity.this, objects);

        rv_deliveryslots.setLayoutManager(new LinearLayoutManager(CheckoutActivity.this));
        rv_deliveryslots.setAdapter(deliverySlotsAdapter);

【问题讨论】:

  • 您应该将objects 参数的类型转换为使用您的类型,而不是通用的Object 类。 (基本上List&lt;Object&gt; 变成了List&lt;DeliverySlotItem&gt;

标签: java android android-recyclerview


【解决方案1】:

在您的 ViewHolder 类中添加此项进行这些更改 -

    public ViewHolder(View itemView) {
                super(itemView);
                ButterKnife.bind(this, view);  // To bind view with ButterKnife

                itemView.setOnClickListener(v -> {
                    if (listener != null && getAdapterPosition() != RecyclerView.NO_POSITION) {
                        listener.onItemClick(objects.get(getAdapterPosition()));
                    }
                });
     }

【讨论】:

    【解决方案2】:

    我认为你的适配器很好。但是,在getItemCount 函数中,您需要检查null。我按如下方式修改了适配器,并让我知道它是否有效。

    public class DeliverySlotsAdapter extends RecyclerView.Adapter<DeliverySlotsAdapter.ViewHolder> {
    
        private Context context;
        LayoutInflater layoutInflater;
        List<Object> objects;
        private LayoutInflater inflater;
        private CallbackListener.SimpleCallback listener;
    
        public DeliverySlotsAdapter(Context context, List<Object> objects) {
            this.context = context;
            this.objects = objects;
            this.inflater = LayoutInflater.from(context);
        }
    
        public void setListener(CallbackListener.SimpleCallback listener) {
            this.listener = listener;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
            RecyclerView.ViewHolder viewHolder;
            View view = inflater.inflate(R.layout.item_checkout_delivery_slots, parent, false);
            return new ViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(final ViewHolder holder, final int position) {
            holder.bind(objects.get(position));
        }
    
        @Override
        public int getItemCount() {
            return objects != null && objects.size() > 0 ? objects.size() : 0;
        }
    
        class ViewHolder extends RecyclerView.ViewHolder {
            @BindView(R.id.tvDeliveryScheduleLabel)
            TextView tvDeliveryScheduleLabel;
    
            public ViewHolder(View itemView) {
                super(itemView);
    
                itemView.setOnClickListener(v -> {
                    if (listener != null && getAdapterPosition() != RecyclerView.NO_POSITION) {
                        listener.onItemClick(objects.get(getAdapterPosition()));
                    }
                });
            }
    
            public void bind(Object object) {
                DeliverySlotItem deliverySlotItem = (DeliverySlotItem) object;
                tvDeliveryScheduleLabel.setText(deliverySlotItem.shop_name + " Delivery");
            }
        }
    }
    

    【讨论】:

    • 仍然不显示项目。 @Reaz Murshed
    • 现在能避免崩溃吗?
    • 它没有崩溃。它没有在我的 RecyclerView 上显示任何内容。我编辑了我的问题并在 MainActivity(onCreate 方法)上添加了我的代码。
    • 您确定您在适配器中传递的列表有项目吗?如果是,您是否在 logcat 中看到任何错误或警告?
    • 是的。但是开。 tvDeliveryScheduleLabel.setText(deliverySlotItem.shop_name + " Delivery");它变为空。我使用断点检查。
    猜你喜欢
    • 2019-05-25
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2020-10-22
    相关资源
    最近更新 更多