2011-11-09 15 views
10

Ho una vista elenco di elementi che devono essere verificabili/non selezionabili. Ho impostato un ArrayAdapter che attualmente sta utilizzando android.R.layout.simple_list_item_multiple_choice come riga e tutto viene visualizzato correttamente. Sono anche in grado di ottenere correttamente i clic su questo elemento. Tuttavia, la casella di controllo nell'interfaccia utente non attiva quando l'elemento è selezionato. Ho cercato di capirlo per un po ', qualcuno può indicarmi la giusta direzione? Voglio solo sapere come forzare l'interfaccia utente per aggiornare per riflettere lo stato modificato della casella di controllo.Attiva/disattiva la casella di controllo a livello di programmazione

Posso fornire il codice se necessario, ma sto cercando di cercare qualcosa di molto specifico qui, quindi immagino che pubblicare un po 'del mio codice non sarebbe di grande aiuto.

Grazie!

risposta

17

Prima di tutto passare attraverso la mia questa risposta: Android listview with check boxes?

Nizza come si desidera implementare controllato/caselle di controllo incontrollate in ListView, è solo necessario implementare sotto linee in GetView() metodo:

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

anche controllare il metodo GetView() per la realizzazione di evento CheckBox risiedono all'interno 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 io sono la tua seguace, puoi dirmi cosa devo fare (leggi/guarda) per sapere di più su Android come fai tu.! Thanks..learnt molto da le tue risposte – MKJParekh

+0

Grazie per le gentili parole, cerco sempre di imparare un argomento per un giorno e di fare SO e il mio blog, cos'altro serve per imparare un nuovo argomento :), da dove vieni? –

+0

India, faccio anche la cosa venire in SO e trovo almeno un argomento che non conosco e ottengo la domanda e la risposta a riguardo ... ma ancora qualche volta mi sono annoiato/stanco di farlo ... ma voi ragazzi continuate a incoraggiarmi. – MKJParekh

1

Hai provato quanto segue?

@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

Gli elementi nell'elenco sono dinamici: non esiste un ID XML univoco per ogni articolo di riga. A meno che non abbia capito quello che ho sbagliato? Ma l'ho provato lo stesso, e ho ottenuto una NullPointerException :( – DashRantic

16

livello di programmazione in codice Java

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

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

In XML Android

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

come

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

È possibile utilizzare un adattatore di base personalizzato. Questo ti permetterà di sceglierne solo uno alla volta, ma puoi cambiarlo annullando l'assegno per vedere quali sono selezionati.

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

} 
Problemi correlati