2016-04-08 47 views
0

RecyclerView içinde CheckBoxes ile seçenekler listem var. Onay kutusuna dokunduğumda durum değiştirilir, ancak yukarı ve aşağı kaydırdıktan sonra onay kutularının durumu kaybolur.Geri Dönüşüm Kutusu durumunu Geri Dönüşüm Kutusu Durumu

Onay kutularının durumu nasıl kaydedilir? Ben adaptörü durumunu değiştirmeye çalışıyorum:

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

} 

}

Bu iki şekilde koruyun yapabilirsiniz
+0

geri dönüşüm sürede sonra kontrol edildikten onay kutusu pozisyonların bir HashMap gibi bir dizi oluşturmak görebilirsiniz ** onSet() ** yöntemi onları alın –

+0

Olası http://stackoverflow.com/questions/32427889/checkbox-in-recyclerview-keeps-on-checking-different-items kopyası –

cevap

2

:

1) depolamak için hashmap kullanın onay kutusu görünümünün konumu. Konumu kaydedebilir ve ayrıca Benzersiz Özel görünüm kimliğini kaydedebilir ve daha sonra Adaptör kullanımı içindeki onay kutusu konumunu kolayca alabilirsiniz.

2) Daha sonra değişken onay kutusunu kontrol edebilirsiniz zaman sonra bunun bir tamsayı değişken oluşturmak do Getter setter sınıfını kullanabilir ve daha sonra kolaylıkla

  • gibi bu değişkendeki konumunu ayarlayabilirsiniz zaman onay kutusu sonra değişken değeri kontrol veya altında yollarla kontrolsüz Kişisel onay kutusu Konumunu koruyun 0

olduğunu işaretini ne zaman değeri 1

  • olduğunu.

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

    Bu, CheckedTextView öğesini içeren bir liste için bir geri dönüştürücü izleme bağdaştırıcısıdır. Bir dize ve bir boole içeren Person adlı bir sınıfı kaydediyorum. Durum, ArrayList'te (Person yerine) ve onBindViewHolder'da checkbox.isChecked kümesini bu konumda boolean'a ayarlayabileceğiniz için benzerdir. Ve bir View.OnClickerListener'u RecyclerView bağdaştırıcısına ayarlayabilir ve ViewHolder onClickListener öğesini YourAdapterName.this olarak ayarlayabilirsiniz. Benim yaptığım gibi Ve sadece güncellemek, Person şeyler gözardı yöntemini uygulamak senin boolean Sen bağdaştırıcılarda onBindViewHolder yöntemi,

    İlgili konular