2016-05-05 7 views
0

Я заполняю 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); 
     } 
    } 
} 

UPDATE:

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

Можете ли вы показать код о том, как вы в настоящее время выводете это? –

+0

Просьба проверить мой код. –

+0

- это элемент, отображаемый ниже linearlayout, отмеченный зеленым цветом, в разных макетах и ​​разных элементах? –

ответ

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

EDIT:

Я предполагаю, что данные внутри отсортирован по ORDER_ID, так что не будет случай, когда есть два элемента с тем же ORDER_ID, что не рядом друг с другом.

Возможно, вы захотите отсортировать их на основе ORDER_ID, прежде чем передавать список в адаптер.

EDIT2:

Добавлено еще условие, как предложено в комментарии.

+2

он не будет работать, если те же самые элементы' ORDER_ID' находятся не рядом с другим (автор должен это уточнить) – snachmsm

+0

вы ' re right, я редактирую это в настоящее время. –

+0

ваш путь прост и, вероятно, достаточен для Parama Sudha, дождитесь его комментария :) – snachmsm

0

скриншот не говорит, что, но если ваш взгляд RecyclerView или ListView тогда я Обрабатывает данные перед подачей на адаптер (т. е. путем переноса вашей модели в другой класс с дополнительным атрибутом с).

В качестве альтернативы вы можете попытаться проверить предыдущую строку (путем выборки его из источника данных или адаптера) при заполнении текущей и настроить вид

+0

Это RecyclerView –

+0

Затем сначала попробуйте второй подход. –

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); для требуемого расположения

+0

надеюсь, что он не сортирует этот список. – Onheiron

+0

не видят кода для фильтрации/сортировки, но при необходимости этот код может запускаться после каждого изменения списка (до 'notifyDataSetChanged'), не забудьте« сбросить »этот флаг до« истины »для всех элементов раньше. Или как в ответе: динамически проверяется в 'onBindViewHolder' (но его не самая лучшая практика) – snachmsm

+0

Спасибо за ваш ответ –

Смежные вопросы