2016-04-08 8 views
0

CheckBoxesのオプションのリストはRecyclerViewにあります。チェックボックスをタップすると状態が変更されますが、上下にスクロールするとチェックボックスの状態は失われます。RecyclerViewにチェックボックスの状態を保存します

チェックボックスの状態を保存するにはどうすればよいですか?私は、アダプタの状態を変更しようとしています:

private void setAdapter() { 
    if (mAdapter == null) { 
     mAdapter = new FacetChildAdapter(mValues, getActivity(), query.getSpecValueAsString(mParentValue.getSlug())) { 
      @Override 
      protected void onCheckBoxRowClicked(CheckboxRow box, Value value, int adapterPosition) { 
       if (type == FacetChildType.Brands) { 
        if (box.isChecked()) { 
         query.removeBrand(value); 
        } else { 
         query.addBrand(value); 
        } 
       } 

       else if (type == FacetChildType.Categories) { 
        if (box.isChecked()) { 
         query.removeCategory(value); 
        } else { 
         query.addCategory(value); 
        } 
       } 

       else if (type == FacetChildType.Deals) { 
        if (box.isChecked()) { 
         query.removeDealType(value); 
        } else { 
         query.addDealType(value); 
        } 
       } 

       else if (type == FacetChildType.Specifications) { 
        if (box.isChecked()) { 
         query.removeSpecification(mParentValue.getSlug(), value); 
        } else { 
         query.addSpecification(mParentValue.getSlug(), value); 
        } 
       } 

       box.setChecked(!box.isChecked()); 
       mHeading.setBackText(getResources().getString(R.string.apply)); 
      } 

     }; 
     mRecyclerView.setAdapter(mAdapter); 

    } else { 
     mAdapter.setSource(query.getSpecValueAsString(mParentValue.getSlug())); 
     mAdapter.refresh(mValues); 
    } 

} 

FacetChildAdapter:それは二つの方法で維持することができます

public class FacetChildAdapter extends GenericRecycleAdapter<Value, Holders.TextImageHolder> { 
private String source; 


public FacetChildAdapter(List<Value> list, Context context, String source) { 
    super(list, context); 
    this.source = source; 
} 

public void setSource(String source) { 
    this.source = source; 
} 

@Override 
protected void onItem(Value s) { 

} 

public Holders.TextImageHolder getCustomHolder(View v) { 
    return new Holders.TextImageHolder(v) { 
     @Override 
     public void onCheckBoxRowClicked(CheckboxRow v) { 
      FacetChildAdapter.this.onCheckBoxRowClicked(v, mList.get(getAdapterPosition()), getAdapterPosition()); 

     } 
    }; 
} 

protected void onCheckBoxRowClicked(CheckboxRow box, Value value, int adapterPosition) { 

} 

@Override 
public int getLayout() { 
    return R.layout.facet_child_row; 
} 

@Override 
public void onSet(final Value item,final Holders.TextImageHolder holder) { 
    holder.checkboxRow.setTitle(Html.fromHtml(item.getFullName())); 
    holder.checkboxRow.setSubText("(" + String.valueOf(item.getCount()) + ")"); 
    holder.checkboxRow.setChecked(ShowProductsWithId.containsValueInValueStringLine(source, item.getSlug())); 
    holder.checkboxRow.setDisabled(!item.isEnabled()); 

} 

}

+0

上でそれを見ることができ、Personものを無視し、メソッドを実装** onSet()**メソッドはそれらを取得します –

+0

可能な複製http://stackoverflow.com/questions/32427889/checkbox-in-recyclerview-keeps-on-checking-different-items –

答えて

2

1)を格納するHashMapを使用しますチェックボックスビューの位置 位置を保存し、一意のIDの特定ビューを保存して、その後でアダプタで使用すると、その中のチェックボックスの位置を簡単に取得できます。

2)あなたは、あなたがあなたが変数、その後のチェックボックスをチェックすることができたときに簡単に

  • のように、この変数内の位置を設定することができ、それには1つの整数の変数を作成してくださいゲッターセッタークラスを使用することができます値は1
  • あなたは、チェックボックスのチェックを外すことができた場合、変数値は0

ある以下の方法で、オンまたはオフあなたのチェックボックスの位置を維持します。

-1
class TeamNamesAdapter extends RecyclerView.Adapter<TeamNamesAdapter.ViewHolder> 
     implements ItemTouchHelperAdapter, View.OnClickListener { 

    private ArrayList<Person> people; 

    public TeamNamesAdapter(TinyDB db) { 
     people = new ArrayList<>(); 
     try { 
      ArrayList<Object> peopleAsObjects = db.getListObject(PEOPLE, Person.class); 
      for (Object obj : peopleAsObjects) { 
       people.add((Person) obj); 
      } 

      if (db.getListObject(PEOPLE_ORDER, Person.class) == null) { 
       db.putListObject(PEOPLE_ORDER, peopleAsObjects); 
      } 
     } 
     catch (NullPointerException e) { 
      return; 
     } 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.team_names_list_item, null); 

     ViewHolder viewHolder = new ViewHolder(view); 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     Person curr = people.get(position); 
     holder.name.setText(curr.name); 
     holder.name.setChecked(curr.available); 
    } 

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

    public void addName(String name) { 
     if(people.contains(name) || name.isEmpty()) 
      return; 

     people.add(new Person(name, true)); 
     notifyDataSetChanged(); 
     update(true); 
    } 

    @Override 
    public void onItemDismiss(int position) { 
     people.remove(position); 
     notifyItemRemoved(position); 
     update(true); 
    } 

    @Override 
    public void onItemMove(int fromPosition, int toPosition) { 
     if (fromPosition < toPosition) { 
      for (int i = fromPosition; i < toPosition; i++) { 
       Collections.swap(people, i, i + 1); 
      } 
     } 
     else { 
      for (int i = fromPosition; i > toPosition; i--) { 
       Collections.swap(people, i, i - 1); 
      } 
     } 
     notifyItemMoved(fromPosition, toPosition); 
     update(true); 
     undoRandomizeButton.setEnabled(false); 
    } 

    @Override 
    public void onClick(View v) { 
     if (!(v instanceof CheckedTextView)) 
      return; 

     CheckedTextView ctv = (CheckedTextView) v; 
     ctv.toggle(); 

     String name = ctv.getText().toString(); 
     for (Person p : people) { 
      if (p.name.equals(name)) { 
       p.available = ctv.isChecked(); 
       update(true); 
       return; 
      } 
     } 
    } 

    class ViewHolder extends RecyclerView.ViewHolder { 
     CheckedTextView name; 
     public ViewHolder(View itemView) { 
      super(itemView); 

      name = (CheckedTextView)itemView.findViewById(R.id.name_in_list); 
      name.setOnClickListener(TeamNamesAdapter.this); 
     } 
    } 
} 

これは、CheckedTextViewを保持するリスト用のrecyclerviewアダプタです。文字列とブールを含むPersonというクラスを保存します。 ArrayListにブール値(Personではなく)だけを保持できるので、状況は似ています。onBindViewHolderには、その場所のブール値にcheckbox.isCheckedを設定します。また、RecyclerViewアダプタにView.OnClickerListenerを設定し、YourAdapterName.thisViewHolder onClickListenerを設定することができます。私が行ったようやリサイクル時に、次にチェックされているチェックボックスの位置のHashMapのような配列を作成するだけで、ちょうどあなたのboolean を更新あなたはアダプタonBindViewHolder方法、

関連する問題