首页 > 解决方案 > RecyclerView 按具体细节排序

问题描述

我正在做一个像 App 这样的甜蜜订单,我想根据订单状态对订单进行排序,比如 Placed(0)、Shipped(1)、OnTheWay(2)、Delivered(3)。如果订单状态为 3(Delivered) 我需要在recyclerview底部显示该订单,目前我正在使用 Stack Format 来查看订单,可以吗?

private void loadOrders(final String phone) {

        adapter = new FirebaseRecyclerAdapter<Request, OrderViewHolder>(
                Request.class,
                R.layout.order_layout,
                OrderViewHolder.class,
                requests.orderByChild("phone").equalTo(phone)
        ) {
            @Override
            protected void populateViewHolder(OrderViewHolder orderViewHolder, final Request request, final int i) {

                final String OrderId, OrderPhone, OrderTotal, OrderAddress, OrderComment, OrderUserName, OrderTime, OrderDate;

                OrderId = adapter.getRef(i).getKey();
                OrderPhone = request.getPhone();
                OrderStatus = Common.convertCodeToStatus(request.getStatus());
                OrderTotal = request.getTotal();
                OrderAddress = request.getAddress();
                OrderComment = request.getComment();
                OrderUserName = request.getName();
                OrderTime = request.getTime();
                OrderDate = request.getDate();

                if (request.getStatus().equals("3")){

                    orderViewHolder.orderStatusImage.setImageResource(R.mipmap.cupcake);
                    orderViewHolder.orderStatusImage.setScaleType(ImageView.ScaleType.CENTER_CROP);

                    orderViewHolder.txtOrderStatus.setVisibility(View.GONE);
                    orderViewHolder.txtOrderDate.setVisibility(View.GONE);
                    orderViewHolder.txtOrderTime.setVisibility(View.GONE);

                    orderViewHolder.deliveredStatus.setVisibility(View.VISIBLE);

                }

                orderViewHolder.txtOrderId.setText(String.format("Order Id :  %s",OrderId));
                orderViewHolder.txtOrderStatus.setText(String.format("Order Status :  %s",OrderStatus));
                orderViewHolder.txtOrderTime.setText(String.format("Order Time : %s",OrderTime));
                orderViewHolder.txtOrderDate.setText(String.format("Order Date : %s",OrderDate));

                if (dialog.isShowing()){
                    dialog.dismiss();
                }

                //Prevention for app crash when user clicks
                orderViewHolder.setItemClickListener(new ItemClickListener() {
                    @Override
                    public void onClick(View view, int position, boolean isLongClick) {
                        Intent orderDetail = new Intent(getActivity(), OrderDetail.class);
                        orderDetail.putExtra("OrderId",OrderId)
                                .putExtra("OrderPhone",phone)
                                .putExtra("OrderTotal",OrderTotal)
                                .putExtra("OrderAddress",OrderAddress)
                                .putExtra("OrderComment",OrderComment)
                                .putExtra("OrderUserName",OrderUserName)
                                .putExtra("OrderTime",OrderTime)
                                .putExtra("OrderDate",OrderDate)
                                .putExtra("OrderStatus",request.getStatus());

                        startActivity(orderDetail);
                    }
                });

            }
        };
        adapter.notifyDataSetChanged();
        recyclerView.setAdapter(adapter);
    }

标签: android

解决方案


如果我理解正确,您要做的是按 0、1、2、3 顺序订购订单。

选项 1:在呈现列表之前对数据进行排序。例如:

...
adapter = new FirebaseRecyclerAdapter<Request, OrderViewHolder>(
                Request.class,
                R.layout.order_layout,
                OrderViewHolder.class,
                requests.orderByChild("status").equalTo(phone)
        )
...

通过对带有状态的数据进行排序requests.orderByChild("status").equalTo(phone),您的列表将显示带有状态序列的订单。当然,随着这一变化,您的列表现在不再按电话号码排序。如果您想同时按电话和状态进行排序,请提供更多代码。

选项 2:如果您可以在创建适配器之前从 firebase 操作数据,则可以将结果拆分为 2 个列表,一个状态为 0、1、2,另一个状态为 3。之后,将 2 列表添加到一个接一个的适配器并将适配器附加到回收器视图。

Recyclerview 的底部内部,就像 Amazon/Flipkart Delivered Orders 显示在底部

因此,在这种情况下,您可以选择选项 2。您可以对 firebase 进行 2 次查询:

  1. 查询状态 = 0,1,2 并保持.orderByChild("phone").equalTo(phone)
  2. 查询状态 = 3 并保留.orderByChild("phone").equalTo(phone)

然后将 2 列表附加到 1 列表中并创建适配器。

为了进一步优化它,您可以只查询1次并将列表拆分为本地上面提到的2个列表,以免查询两次。


推荐阅读