2015-12-13 2 views
0

прежде чем вы укажете это как дубликат, я прочитал много сообщений об этом, но не нашел ответа на мое решение.Изменения видимости флажков при прокрутке RecyclerView

У меня есть RecyclerView, заполненный некоторыми данными из базы данных. Каждый товар RecyclerView имеет CheckBox первоначально с android:visibility="gone". Затем я нажимаю кнопку, и каждый пункт CheckBox из RecyclerView должен появиться. Когда я прокручу вниз, чтобы увидеть, появились ли все CheckBoxes, верхние CheckBoxes скрыты.

Мой код:

private void setupButtonCallbacks() { 
     modify.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       for (int position=0; position<recyclerView.getChildCount();position++){ 
        recyclerView.getChildAt(position).findViewById(R.id.deleteCheckCartItem).setVisibility(View.VISIBLE); 
        recyclerView.getChildAt(position).findViewById(R.id.deleteCheckCartItem).setTag(position); 
       } 
       adapter.notifyDataSetChanged(); 
      } 
     }); 
    } 

Адаптер:

public class CartAdapter extends RecyclerView.Adapter<CartAdapter.CartViewHolder>{ 

    List<CartList> cartItems; 
    Context context; 
    CartList lista; 

    public CartAdapter(List<CartList> cartItems, Context context){ 
     this.cartItems = cartItems; 
     this.context = context; 
    } 

    @Override 
    public CartViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cart_row_item, parent, false); 
     CartViewHolder pvh = new CartViewHolder(view); 
     return pvh; 
    } 

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

     holder.cartProductName.setText(cartItems.get(position).getName()); 
     holder.cartProductprice.setText(cartItems.get(position).getPrice()); 
     holder.pref1.setText(cartItems.get(position).getPreferation1()); 
     holder.pref2.setText(cartItems.get(position).getPreferation2()); 
     holder.pref3.setText(cartItems.get(position).getPreferation3()); 
     holder.pref4.setText(cartItems.get(position).getPreferation4()); 
     holder.quantity.setText(cartItems.get(position).getQuantity()); 
     Ion.with(holder.cartProductImage).placeholder(R.mipmap.placeholder).error(R.mipmap.placeholder).load(cartItems.get(position).getImage()); 
     final CartList list = cartItems.get(position); 
     holder.checkBox.setTag(list); 
     holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (holder.checkBox.isChecked()){ 
        Toast.makeText(context, "Item Checked is " + cartItems.get(position).getName(), Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 

    } 

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

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

    public static class CartViewHolder extends RecyclerView.ViewHolder { 
     CardView cardView; 
     CheckBox checkBox; 
     TextView cartProductName, cartProductprice, pref1, pref2, pref3, pref4, quantity; 
     ImageView cartProductImage; 
     LinearLayout linearLayout; 

     CartViewHolder(View itemView) { 
      super(itemView); 
      cardView = (CardView)itemView.findViewById(R.id.card_view); 
      linearLayout = (LinearLayout)itemView.findViewById(R.id.rootLinear); 
      checkBox = (CheckBox)itemView.findViewById(R.id.deleteCheckCartItem); 
      cartProductName = (TextView)itemView.findViewById(R.id.product_name_cart); 
      cartProductprice = (TextView)itemView.findViewById(R.id.product_price_cart); 
      pref1 = (TextView)itemView.findViewById(R.id.pref1_text_cart); 
      pref2 = (TextView)itemView.findViewById(R.id.pref2_text_cart); 
      pref3 = (TextView)itemView.findViewById(R.id.pref3_text_cart); 
      pref4 = (TextView)itemView.findViewById(R.id.pref4_text_cart); 
      quantity = (TextView)itemView.findViewById(R.id.quantity_text_cart); 
      cartProductImage = (ImageView)itemView.findViewById(R.id.product_image_cart); 

     } 
    } 

} 

Макет:

<android.support.v7.widget.CardView 
     android:id="@+id/card_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="15dp"> 

     <LinearLayout 
      android:id="@+id/rootLinear" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="?android:attr/selectableItemBackground" 
      android:clickable="true" 
      android:focusable="true" 
      android:orientation="vertical"> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="horizontal"> 

       <CheckBox 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:padding="15dp" 
        android:visibility="gone" 
        android:focusable="false" 
        android:layout_gravity="center_vertical" 
        android:id="@+id/deleteCheckCartItem" /> 

Результат является:

Первые 2 пункты, имеющие нормальное поведение и

First

и последние две не имеющие Флажки видимого

Second

Update Как я предложил я пытался следить за позиции видимых, как это:

private void setupButtonCallbacks() { 
     modify.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       for (int position = 0; position < recyclerView.getChildCount(); position++) { 
        recyclerView.getChildAt(position).findViewById(R.id.deleteCheckCartItem).setVisibility(View.VISIBLE); 
        cartItems.get(position).setCheckboxIsVisible(true); 
        adapter.notifyDataSetChanged(); 
       } 
       actionMode = startSupportActionMode(actionModeCallback); 
       actionMode.setTitle(getString(R.string.selected_modifiable_items)); 
      } 
     }); 
    } 

Адаптер:

@Override 
public void onBindViewHolder(final CartViewHolder holder, final int position) { 
    holder.cartProductName.setText(cartItems.get(position).getName()); 
    holder.cartProductprice.setText(cartItems.get(position).getPrice()); 
    holder.pref1.setText(cartItems.get(position).getPreferation1()); 
    holder.pref2.setText(cartItems.get(position).getPreferation2()); 
    holder.pref3.setText(cartItems.get(position).getPreferation3()); 
    holder.pref4.setText(cartItems.get(position).getPreferation4()); 
    holder.quantity.setText(cartItems.get(position).getQuantity()); 
    Ion.with(holder.cartProductImage).placeholder(R.mipmap.placeholder).error(R.mipmap.placeholder).load(cartItems.get(position).getImage()); 
    lista = cartItems.get(position); 
    holder.checkBox.setVisibility(lista.isCheckboxIsVisible()?View.VISIBLE:View.GONE); 
    holder.checkBox.setChecked(lista.isChecked()); 
    holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (holder.checkBox.isChecked()) { 
       //Toast.makeText(context, "Item Checked is " + cartItems.get(position).getName(), Toast.LENGTH_SHORT).show(); 
       boolean condition = cartItems.get(position).isChecked(); 
       condition = isChecked; 
      } 


     } 
    }); 

} 

Это только делает это в течение первых 3-х элементов в списке, а затем не выбран ни один из них ...

Любые идеи? Заранее спасибо!!!

+0

кто-либо предложения? –

+0

попробуйте использовать [эту библиотеку] (https://github.com/vivchar/RendererRecyclerViewAdapter), см. ViewStates, это поможет вам восстановить состояние проверки после прокрутки – Vitaly

ответ

4

Ваш CartList cartItems должен отслеживать состояние видимости и флажка.

class CartList 
... 
    boolean checkboxIsVisible=false;//todo add setters and getters 
    boolean isChecked=false;//todo add setters and getters 

затем в onBindViewHolder()

final CartList list = cartItems.get(position); 
     holder.checkBox.setVisible(list.checkboxIsVisible?View.VISIBLE:View.GONE); 
     holder.checkBox.setChecked(list.isChecked) 

проверил

... 
@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       ... 
       cartItems.get(position).isChecked=isChecked; 
      } 

modify видимость

... 
@Override 
public void onClick(View v) { 
...//Some logic here that sets visibility to true or false 
    recyclerView.getChildAt(position).checkboxIsVisible=true; 
... 
    adapter.notifyDataSetChanged(); 
} 
+0

он не работает для всех предметов только для первых трех –

+0

Stange? даже если ваши объекты отслеживают свое состояние и устанавливают его в onBindViewHolder()? проверьте его снова ... – TouchBoarder

+1

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

2

Взгляды RecyclerView перерабатываются, как говорится в названии. Поэтому, если пользователь проверяет флажок на одном элементе, для другого элемента, который не был отмечен, он все еще находится в проверенном состоянии.

Вы должны в checkBox.setChecked(true/false) в каждом onBindViewHolder()

означает, что вы должны следить за какой элемент был проверен флажок (ArrayList проверяемых элементов, HashMap с деталями и логическими значениями, что угодно).

+0

. Проблема в том, что этот флажок не установлен или не установлен. проблема заключается в том, что когда я просматриваю изменения видимости флажка –

+0

@ helldawg13 Тот же принцип применяется к этому. Вы должны установитьVisibility на каждом onBindViewHolder, который вы в настоящее время не используете. – FWeigl

+0

Можете ли вы привести пример с кодом? –

1

я столкнулся с той же проблемой в моем проекте. То, что я был установить Невидимое поле как на OnBindViewHolder и на адаптере setOnClickListner

mAdapterForChooser.setClickListener(new AdapterForChooser.ClickListener() { 

       @Override 
       public void onClick(View v, int pos) { 



        RelativeLayout rl = (RelativeLayout) v.findViewById(R.id.selectedBg); 

        if (!mGiantChooserModels.get(pos).isSelected()) { 

         rl.setVisibility(View.VISIBLE); 

        } else { 
         rl.setVisibility(View.INVISIBLE); 

       } 
      }); 

И мой держатель

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



    //Main Trick 

    if(mGiantChooserModels.get(position).isSelected()) 
     holder.selector.setVisibility(View.VISIBLE); 
    else 
     holder.selector.setVisibility(View.INVISIBLE); 

    holder.itemView.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      clickListener.onClick(v, position); 
     } 
    }); 
} 
Смежные вопросы