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

Android 在重复数据时更改视图的可见性,android,android-recyclerview,visibility,listitem,Android,Android Recyclerview,Visibility,Listitem,我通过从应用程序中的服务器检索数据来填充OrderHistory。这里我需要根据OrderId填充listitem。如果OrderId重复,我需要隐藏屏幕截图中以绿色标记的LinearLayout。否则,布局必须是常规视图。请帮助我 MyAdapter类: public class MyOrderAdapter extends RecyclerView.Adapter<MyOrderAdapter.ViewHolder> { Context mContext; Li

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

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

屏幕截图没有说明这一点,但是如果您的视图是RecyclerView或ListView,那么我会在将数据提供给适配器之前对其进行预处理(即,通过将您的模型包装到另一个具有附加属性的类中)


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

屏幕截图不会显示这一点,但如果您的视图是RecyclerView或ListView,则我会在将数据馈送到适配器之前对其进行预处理(即,通过将模型包装到另一个具有附加属性的类中)


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

可能只需将字段
boolean repeatOrderId
添加到您的
CartRes
类中,并在构造函数中对所有项执行一些
循环和标记?您也可以在运行时进行检查,但您有一个非常固定的列表,在构造函数中准备此标记对性能更有利

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

for(int i=0;i也许只需将字段
boolean repeatOrderId
添加到您的
CartRes
类中,然后在构造函数中对
循环并标记所有项?您也可以在运行时检查,但您有一个非常固定的列表,在构造函数中准备此标记对性能更好

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

for(int i=0;i一种方法:

  • 拥有一个新的holder变量,该变量引用要隐藏的
    线性布局

  • 在您的
    onBindViewHolder()中

  • 编辑

    我假设里面的数据是按ORDER_ID排序的,所以不会有两个元素具有相同的ORDER_ID,但彼此不相邻的情况

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

    EDIT2:

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

    添加了注释中建议的else条件。

    一种方法:

  • 拥有一个新的holder变量,该变量引用要隐藏的
    线性布局

  • 在您的
    onBindViewHolder()中

  • 编辑

    我假设里面的数据是按ORDER_ID排序的,所以不会有两个元素具有相同的ORDER_ID,但彼此不相邻的情况

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

    EDIT2:

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


    添加了注释中建议的其他条件。

    能否显示当前如何输出的代码?请检查我的代码。下面显示的项目是否在不同的布局和不同的项目中以绿色标记?与其多次重复相同的订单id,我需要隐藏它是否重复。否则它必须显示Yeah..Tha绿色linearLayout@rajenraiyarelau下面的不同linearLayout可以显示您当前输出的代码吗?请检查我的代码。在绿色linearLayout下面显示的项目是否在不同的布局和不同的项目中?与其多次重复相同的订单id,我需要隐藏它是否重复。否则它必须be shownYeah..这是不同的linearLayout,在绿色linearLayout@rajenraiyarela下面,当第一次尝试第二种方法时,它是Recycleriver。当第一次尝试第二种方法时,它是Recycleriver。希望他不会对列表进行排序。没有看到任何用于筛选/排序的代码,但如果需要,此代码可能会在每次更改列表后运行(在
    notifyDataSetChanged
    之前),不要忘记对之前的所有项目将此标志“重置”为
    true
    。或者类似于回答:动态检查
    onBindViewHolder
    (但这不是最佳做法)感谢您的回答希望他不会对列表进行排序。没有看到任何用于筛选/排序的代码,但如果需要,此代码可能会在每次列表更改后运行(在
    notifyDataSetChanged
    之前),不要忘了“重置”对于之前的所有项目,将此标志设置为
    true
    。或者类似于回答:动态检查
    onBindViewHolder
    (但这不是最佳做法)感谢您的回答如果相同的
    订单ID
    项目不在另一个项目旁边,则此标志无效(作者应对此进行精确说明)你的方法很简单,可能对Parama Sudha来说已经足够了,让我们等待他的评论:)请检查我的更新。这是正确的吗?我尝试了,但没有得到我期望的结果。它应该是正确的。ORDER_ID是什么类型?你可能需要使用
    .equals()
    进行比较。@Paramasuda确保在else条件下,您也可以再次查看视图。如果相同的
    订单ID
    项目不相邻,则无法进行比较(作者应对此进行精确说明)。您的方法很简单,对于Parama Sudha来说可能已经足够了,让我们等待他的评论:)请检查我的更新。这是正确的吗?我尝试了,但没有得到我期望的结果。它应该是正确的。订单ID是什么类型的?您可能需要使用
    .equals()
    来比较它。@Paramasuda确保在其他情况下您也可以再次查看视图。