2015-12-13 49 views
0

之前,你把這標記爲重複我已閱讀了很多關於此的帖子,但沒有找到我的解決方案的答案。複選框的可見性變化,而滾動RecyclerView

我有一個RecyclerView正在填充一些來自數據庫的數據。每RecyclerView項目有CheckBox最初與android:visibility="gone"。然後我按下按鈕,出現RecyclerView的每個項目的CheckBox。當我向下滾動查看是否所有複選框出現頂部複選框都被隱藏。

我的代碼:

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

最後兩個都沒有的CheckBox可見

Second

更新 正如我建議我試圖保持位置這樣的可見的軌跡:

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()

,這意味着你必須保持對這些項目的複選框被選中的軌道(檢查項目ArrayListHashMap與項目和布爾值,等等)。

+0

我的問題不在於複選框已選中或未選中。問題是,當我滾動複選框的可見性變化 –

+0

@ helldawg13同樣的原則適用於此。你必須在每個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); 
     } 
    }); 
}