2016-04-08 16 views
0

Ich habe eine Liste von Optionen mit CheckBoxes in RecyclerView. Wenn ich auf das Kontrollkästchen klicke, wird der Status geändert, aber nach dem Auf- und Abwärtsscrollen ist der Status der Checkboxen verloren.Speichern Checkbox-Status in RecyclerView

Wie man den Status der Checkboxen speichert? Ich versuche, den Staat in Adapter zu ändern:

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

erstellen ein Array wie eine HashMap von Kontrollkästchen Positionen, die dann in recycle Zeit geprüft wurden ** onSet() ** method get sie –

+0

Mögliche duplicate von http://stackoverflow.com/questions/32427889/checkbox-in-recyclerview-keeps-on-checking-different-items –

Antwort

2

Es kann auf zwei Arten pflegen:

1) Verwenden Sie die HashMap zu speichern die Position der Kontrollkästchenansicht. Sie können die Position speichern und auch die Eindeutige ID der bestimmten Ansicht speichern und dann nach der Verwendung des Adapters die Checkbox-Position darin leicht abrufen.

2) Wann können Sie die Getter Setter-Klasse verwenden, dann erstellen Sie die eine Integer-Variable in es und dann können Sie leicht die Position in dieser Variablen wie

  • Wenn Sie überprüfen können Sie das Kontrollkästchen dann Variable Wert 1
  • Wenn Sie das Kontrollkästchen dann 0 Variablenwert

Ihr Kontrollkästchen Position halten deaktivieren können in folgenden Arten aktiviert oder deaktiviert.

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

Dies ist ein Recyclerview-Adapter für eine Liste, die eine CheckedTextView enthält. Ich speichere eine Klasse namens Person, die eine Zeichenfolge und eine Bool enthält. Sie haben eine ähnliche Situation, da Sie in der ArrayList nur Boolesche Werte (anstelle von Person) speichern können und onBindViewHoldercheckbox.isChecked auf den booleschen Wert an dieser Position setzen. Sie können einen View.OnClickerListener auf dem RecyclerView-Adapter festlegen und den ViewHolder onClickListener auf YourAdapterName.this setzen. Und Umsetzung der Methode, wie ich es tat, einfach ignorieren die Person Sachen, einfach aktualisieren Sie Ihre boolean Sie können, dass onBindViewHolder Methode auf den Adapter sehen,

Verwandte Themen