2011-11-09 19 views
10

Mam ListView elementów, które muszą być checkable/uncheckable. Skonfigurowałem ArrayAdapter, który aktualnie używa android.R.layout.simple_list_item_multiple_choice jako wiersz, a wszystko wyświetla się dobrze. Jestem również w stanie prawidłowo uzyskać kliknięcia tego elementu. Jednak pole wyboru w interfejsie użytkownika nie przełącza się na po wybraniu elementu. Próbowałem to rozgryźć przez chwilę, czy ktoś może wskazać mi właściwy kierunek? Chcę tylko wiedzieć, jak wymusić aktualizację interfejsu, aby odzwierciedlić zmieniony stan pola wyboru.Przełącz programowo programowo

Mogę podać kod w razie potrzeby, ale staram się znaleźć tutaj coś bardzo szczegółowego, więc wyobrażam sobie, że umieszczenie w kręgu mojego kodu nie byłoby zbyt pomocne.

Dzięki!

Odpowiedz

17

Przede wszystkim przejść przez moją tej odpowiedzi: Android listview with check boxes?

Nicea jak chcesz wprowadzić zaznaczone/odznaczone pola wyboru w ListView, wystarczy wdrożyć poniżej linii w getView() metoda:

// also check this lines in the above example 
ViewHolder holder = (ViewHolder) view.getTag(); 
holder.checkbox.setChecked(list.get(position).isSelected()); 

także sprawdzić metodę getView() za realizację imprezy na CheckBox przebywających wewnątrz ListView:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView == null) { 
     LayoutInflater inflator = context.getLayoutInflater(); 
     view = inflator.inflate(R.layout.rowbuttonlayout, null); 
     final ViewHolder viewHolder = new ViewHolder(); 
     viewHolder.text = (TextView) view.findViewById(R.id.label); 
     viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); 
     viewHolder.checkbox 
      .setOnCheckedChangeListener(
       new CompoundButton.OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, 
         boolean isChecked) { 
        Model element = (Model) viewHolder.checkbox 
          .getTag(); 
        element.setSelected(buttonView.isChecked()); 
       } 
      }); 
     view.setTag(viewHolder); 
     viewHolder.checkbox.setTag(list.get(position)); 
    } else { 
     view = convertView; 
     ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); 
    } 
    ViewHolder holder = (ViewHolder) view.getTag(); 
    holder.text.setText(list.get(position).getName()); 
    holder.checkbox.setChecked(list.get(position).isSelected()); 
    // ...... 
} 
+1

+1 Jestem twoim zwolennikiem, czy możesz mi powiedzieć, co robić (czytaj/oglądaj), aby dowiedzieć się więcej o Androidzie, tak jak ty.! Dzięki ... dużo się od twoje odpowiedzi: – MKJParekh

+0

Dziękuję za miłe słowa, zawsze staram się nauczyć tematu na jeden dzień i robić TAK i mój blog, czego jeszcze potrzeba, aby nauczyć się nowego tematu :), Skąd jesteś? –

+0

Indie, ja też robię to, co przychodzi do SO i znajduję co najmniej jeden temat, którego nie znam, i dostaję pytanie i odpowiedź na ten temat .. ale wciąż kiedyś się znudziam/jestem zmęczony robieniem tego .. ale ciągle mnie zachęcacie. – MKJParekh

1

Czy próbowałeś następujące elementy?

@Override 
public void onListItemClick(ListView listView, View view, int position, long id) { 

    //Invert the checkbox-status   
    ((CheckedTextView) view.findViewById(R.id.text1)).setChecked(!isChecked()); 

    return; 

} 
+0

Pozycje na liście są dynamiczne - nie ma unikatowego identyfikatora XML dla każdego elementu wiersza. Chyba że rozumiem to źle? Ale mimo to spróbowałem i uzyskałem NullPointerException :( – DashRantic

16

programowo w kodzie java

CheckBox mCheckBox = (CheckBox) findViewById(R.id.checkBox); 

mCheckBox.setChecked(true); //to check 
mCheckBox.setChecked(false); //to uncheck 

w Android XML

android:checked="true" //to check 
android:checked="false" //to uncheck 

jak

<CheckBox 
    android:id="@+id/checkBox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:checked="true" 
    android:text="Checkbox Item" /> 
0

Można użyć adaptera zwyczaj bazową. Pozwoli ci to wybrać tylko jedną na raz, ale możesz to zmienić, cofając czek, aby zobaczyć, które z nich są wybrane.

public class CheckBoxGridAdapter extends BaseAdapter{ 

    LayoutInflater inflater; 
    ArrayList<Holder> list; 
    int res; 
    Context context; 

    public CheckBoxGridAdapter(Context context, ArrayList<Holder> list, int layoutResourceId) { 
     inflater = LayoutInflater.from(context); 
     this.context = context; 
     this.list =list; 
     this.res = layoutResourceId; 
    } 

    @Override 
    public int getCount() { 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     if (convertView == null) { 
      convertView = inflater.inflate(res, 
        parent, false); 
      holder = new ViewHolder(); 
      holder.tv1 = (TextView) convertView.findViewById(R.id.checkBoxTxt); 
      holder.cb = (CheckBox) convertView.findViewById(R.id.checkBox); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     Holder h = list.get(position); 
     holder.tv1.setText(h.getCBName()); 
     holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, 
        boolean isChecked) { 
       if(isChecked) 
       { 
        int pos = (Integer) buttonView.getTag(); 
        checkChecks(pos);    
       } 
       CheckBoxGridAdapter.this.notifyDataSetChanged(); 
      } 
     }); 
     holder.cb.setTag(position); 
     holder.cb.setChecked(list.get(position).getSelectState()); 
     return convertView; 
    } 

    protected void checkChecks(int pos) { 
      for(int i = 0;i<list.size();i++) 
      { 
       Holder h = (Holder) list.get(i); 
       if(i==pos) 
       { 
        Log.d(pos +" checked","is checked"); 
        h.setSelectState(true); 
       } 
       else 
       { 
        Log.d(i +" checked","is not checked"); 
        h.setSelectState(false); 
       } 
      } 
    } 

    static class ViewHolder 
    { 
     TextView tv1; 
     CheckBox cb; 
     RadioButton rb; 
    } 

} 
Powiązane problemy