android - 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);
}
解决方案
如果我理解正确,您要做的是按 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 次查询:
- 查询状态 = 0,1,2 并保持
.orderByChild("phone").equalTo(phone)
- 查询状态 = 3 并保留
.orderByChild("phone").equalTo(phone)
然后将 2 列表附加到 1 列表中并创建适配器。
为了进一步优化它,您可以只查询1次并将列表拆分为本地上面提到的2个列表,以免查询两次。
推荐阅读
- typescript - 导出模型并在模板上使用
- android - Xamarin Forms - 无需任何用户交互即可拍照
- ruby-on-rails - 如何在 URL 中发送电子邮件地址
- flutter - 如何在 buttonPressed 上的 showModel 中显示不同的小部件
- php - 在另一个字符之前删除一个字符
- javascript - webRTC - 区分临时断开或故障和永久
- swift - 在 iOS 上使用 Pushy 在 Capacitor/Cordova 中更改徽章通知计数
- python - 我可以将 numpy.std() 应用于什么?
- c# - 使用 System.Diagnostics.Process 和 CMD 完成后,有没有办法获得 dd 结果?
- python - 将元组列表转换为命名字典列表