重复数据时更改视图的可见性

时间:2016-05-05 06:50:27

标签: android android-recyclerview visibility listitem

我通过在我的应用中从服务器检索数据来填充OrderHistory。这里我需要填充listitem取决于OrderId。如果OrderId重复,我需要隐藏在截图中以绿色标记的LinearLayout。否则布局必须是常见的视图。请帮助我。

enter image description here

MyAdapter类:

public class MyOrderAdapter extends RecyclerView.Adapter<MyOrderAdapter.ViewHolder> {
    Context mContext;
    List<CartRes> mOrderList = new ArrayList<>();

    private ImageLoader imageLoader;

    public MyOrderAdapter(Context context, List<CartRes> orderList) {
        mContext = context;
        mOrderList = orderList;

        Log.e("Json Adapter", "" + mOrderList);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_order_history, parent, false);
        ViewHolder viewHolder = new ViewHolder(v);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        holder.cartResOrder = mOrderList.get(position);

        imageLoader = CustomVolleyRequest.getInstance(mContext).getImageLoader();

        String IMAGE_URL = "http://" + Config.IMAGE_URL + holder.cartResOrder.ORDER_IMAGE;
        Log.e("Image URL", IMAGE_URL + "  " + holder.cartResOrder.ORDER_IMAGE);

        imageLoader.get(IMAGE_URL, ImageLoader.getImageListener(holder.orderImage, 0, 0));

        holder.orderImage.setImageUrl(IMAGE_URL, imageLoader);


        holder.txtOrderId.setText(holder.cartResOrder.ORDER_ID);
        holder.txtOrderProduct.setText(holder.cartResOrder.ORDER_PRODUCT);
        holder.txtorderedDate.setText(holder.cartResOrder.ORDER_DATE);
        holder.txtDeliveredDate.setText(holder.cartResOrder.ORDER_DELIVERY_DATE);

    }


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

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView txtOrderId, txtOrderProduct, txtorderedDate, txtDeliveredDate;
        Button butDetail, butRemove;
        NetworkImageView orderImage;
        CartRes cartResOrder;

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

            txtOrderId = (TextView) itemView.findViewById(R.id.orderId);
            txtOrderProduct = (TextView) itemView.findViewById(R.id.orderProduct);
            txtorderedDate = (TextView) itemView.findViewById(R.id.orderedDate);
            txtDeliveredDate = (TextView) itemView.findViewById(R.id.orderDeliveredDate);

            butDetail = (Button) itemView.findViewById(R.id.orderViewDetail);
            butRemove = (Button) itemView.findViewById(R.id.orderRemove);

            orderImage = (NetworkImageView) itemView.findViewById(R.id.OrderproductImage);
        }
    }
}

更新

public void onBindViewHolder(ViewHolder holder, int position) {

    holder.cartResOrder = mOrderList.get(position);

    imageLoader = CustomVolleyRequest.getInstance(mContext).getImageLoader();

    String IMAGE_URL = "http://" + Config.IMAGE_URL + holder.cartResOrder.ORDER_IMAGE;
    Log.e("Image URL", IMAGE_URL + "  " + holder.cartResOrder.ORDER_IMAGE);

    imageLoader.get(IMAGE_URL, ImageLoader.getImageListener(holder.orderImage, 0, 0));

    holder.orderImage.setImageUrl(IMAGE_URL, imageLoader);

    holder.txtOrderId.setText(holder.cartResOrder.ORDER_ID);
    holder.txtOrderProduct.setText(holder.cartResOrder.ORDER_PRODUCT);
    holder.txtorderedDate.setText(holder.cartResOrder.ORDER_DATE);
    holder.txtDeliveredDate.setText(holder.cartResOrder.ORDER_DELIVERY_DATE);

    if (position > 0 && mOrderList.get(position).ORDER_ID == mOrderList.get(position - 1).ORDER_ID) {
        //make sure it is not the first one, and make sure it has the same ID as previous.
        holder.OrderLinear.setVisibility(View.GONE); //hide it, you need to set the reference first.
        holder.txtOrderId.setVisibility(View.GONE);
    }
}

3 个答案:

答案 0 :(得分:3)

你可以采取一种方式:

  1. 有一个新的持有人变量引用您要隐藏的LinearLayout

  2. onBindViewHolder()

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        //setup everything else above...
    
        if (position > 0 && mOrderList.get(position).ORDER_ID == mOrderList.get(position - 1).ORDER_ID){
            //make sure it is not the first one, and make sure it has the same ID as previous.
            holder.thelinearlayout.setVisibility(View.GONE); //hide it, you need to set the reference first.
        }else holder.thelinearlayout.setVisibility(View.VISIBLE);
            //if somehow order gets changed.(e.g. previous row is deleted).
    
    }
    
  3. 修改

    我假设里面的数据按ORDER_ID排序,因此不会出现两个具有相同ORDER_ID的元素彼此不相邻的情况。

    在将列表传递给适配器之前,您可能希望根据ORDER_ID对它们进行排序。

    <强> EDIT2:

    添加了评论中建议的其他条件。

答案 1 :(得分:0)

屏幕截图没有说明,但如果您的视图是RecyclerView或ListView,那么我先将数据预先处理到适配器(即将模型包装到另一个具有其他属性的类中)。

或者,您可以尝试检查上一行(通过从数据源或适配器中获取),同时填充当前行并调整视图

答案 2 :(得分:0)

也许只需将字段boolean repeatOrderId添加到CartRes类,然后在构造函数中执行一些for循环并标记所有项目?您也可以在运行时检查,但是您有非常固定的列表,准备在construtor中这个标志更适合性能

for(int i=0; i<mOrderList.getCount(); i++){
    CartRes cr = mOrderList.get(i);
    cr.repeatOrderId=true;
    for(int j=0; j<i; j++){
        if(cr.ORDER_ID==mOrderList.get(j).ORDER_ID){
            cr.repeatOrderId=false; //default true
            break;
        }
    }
}

然后在onBindViewHolder内检查此标记,setVisibility(cr.repeatOrderId);检查所需的布局