2012-09-28 8 views
15

Sto caricando i contatti del telefono in un ListView personalizzato. Ogni riga è un LinearLayout selezionabile contenente CheckedTextView e un altro TextView.Impossibile controllare/deselezionare CheckedTextView all'interno di getView

Sto alimentando la visualizzazione elenco con un ArrayAdapter personalizzato. Il mio problema è che non posso controllare CheckedTextViews all'interno di getView(). Per esempio quando provo il seguente

public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     if(row == null){    
      row = inflater.inflate(layout, parent, false); 
     } 

     CheckedTextView checkedTextView = (CheckedTextView) row.findViewById(R.id.checkedTextView); 
     checkedTextView.setText("A"); 
     checkedTextView.setChecked(true); 
     return row; 
    } 

che dovrebbe controllare ogni visualizzazione di testo ogni volta che scorrere la vista lista, ma che non sta accadendo. Qualcuno può dirmi come si fa?

EDIT: E 'importante controllare all'interno GetView(), non posso solo controllare tutti dopo setListAdapter()

EDIT2: Questo è il file XML che mostra la vista di ogni riga

<?xml version="1.0" encoding="utf-8"?> 
<com.example.multiplecontacts.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <CheckedTextView 
     android:id="@+id/checkedTextView" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:checkMark="?android:attr/listChoiceIndicatorMultiple" 
     android:paddingBottom="0dp" 
     android:text="CheckedTextView" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
     android:id="@+id/subTextView" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Small Text" 
     android:paddingTop="0dp" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

</com.example.multiplecontacts.CheckableLinearLayout> 

CheckableLinearLayout è un layout personalizzato che estende LinearLayout e implementa Checkable come detto prima. E l'ho preso da here

+0

Non ho bisogno di essere controllati per impostazione predefinita. In realtà il codice sopra non è il mio codice reale, è solo un esempio che dimostra il mio problema. Tutto ciò di cui ho bisogno è di essere in grado di attivare CheckedTextView all'interno di getView() –

+0

puoi postare il file xml –

+0

Hai il layout con 'checkbox' ma quando premi la' checkbox' non viene controllato? –

risposta

26

Hai impostato una proprietà checkMark per il tuo CheckedTextView nel tuo layout xml?

Ad esempio: android:checkMark="?android:attr/listChoiceIndicatorMultiple

CheckedTextView non è solo una casella di controllo con un testo. Si deve anche notare che CheckedTextView non è attivabile, o cliccabile senza qualche manipolazione (da quando è stato progettato per ListView e quindi è stato deve essere controllato da ListView di setOnItemClickListener)

setChoiceMode deve essere impostato per un controllo ListView. E il controllo della riga all'interno di getView dell'adattatore deve essere effettuato tramite: listView.setItemChecked(position, value)

+0

L'ho fatto. E viene controllato/deselezionato normalmente quando premo un oggetto da solo. È solo all'interno di getView() che si comporta in questo modo. –

+0

Quindi può essere controllato solo in setOnItemClickListener ?? non c'è modo di attivarlo al di fuori di esso? –

+0

Dove dovrebbe essere scritto questo pezzo di codice? Sto cercando di attivare automaticamente checkedTextView, non quando viene rilasciato un evento onClick. Ho già implementato onListItemClick e funziona bene. –

1

Quando si scorre l'elenco, ogni volta che chiama il metodo getview(). Quindi, se hai una casella di controllo o una casella di modifica in elenco, la reinizializzerà.

La mia idea è di memorizzare lo stato (selezionato o deselezionato) della casella di controllo. Quindi qui ho usato ArrayList per primo lo ho riempito con un valore falso, quindi sul suo evento click ho usato per memorizzarlo stato attuale.

class MyAdapter extends BaseAdapter implements OnClickListener { 

    private ArrayList<Boolean> checks=new ArrayList<Boolean>();//Boolean type array to manage check box 

    private static LayoutInflater inflater=null; 

    public MyAdapter(Context context, ArrayList<HashMap<String, String>> d) 
    { 
       inflater =  (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     //fill with false values 
    for (int i = 0; i < d.size(); i++) 
    { 
      checks.add(i, false); 
    } 
    } 

    public int getCount() 
    { 
     return data.size(); 
    } 

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

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




     public View getView(int position, View convertView, ViewGroup parent) 
     { 

     View vi=convertView; 

     if(convertView==null) 

      vi = inflater.inflate(R.layout.<your layout>, null); 

      //Checkbox is of button type----android:button="@drawable/btn_check" 
      //make a selector xml for checkbox  

      checkBox=(CheckBox)vi.findViewById(R.id.check_box); 


      checkBox.setTag(Integer.valueOf(position)); 
      checkBox.setOnClickListener(this); 
      checkBox.setChecked(checks.get(position)); 


     return vi; 
    } 

     @Override 
     public void onClick(View v) 
     { 
      int viewId=v.getId(); 
      if(viewId== R.id.check_box) 
      { 
      Integer index = (Integer)v.getTag(); 
      boolean state = checks.get(index.intValue()); 
      checks.set(index.intValue(), !state); 

      } 
     } 
    } 

Aggiornamento: Soluzione 2: è possibile inserire una variabile booleana nella classe ViewHolder. Questa variabile booleana verrà utilizzata per definire se l'elemento è selezionato o meno.

Spero che questo dovrebbe aiutarti.

+0

checkBox.setChecked (checks.get (posizione)); è questo che lavora con te? è checkBox di tipo CheckedTextView o solo una checkbox? –

+0

@IslamHassan si sta lavorando al mio fianco. Qui la mia checkbox è di tipo Button. –

1

@ Pier-Luc Gendreau e @fox hanno menzionato la soluzione nei commenti ma non in risposta, quindi la risposta è stata inviata a loro nome.

Come accennato da @AlexOrlov, CheckedTextView non è selezionabile o cliccabile senza alcuna modifica. Quindi, ciò che devi fare è impostare il controllo degli elementi utilizzando ListView, puoi farlo dall'adattatore stesso o da attività/frammento in cui hai ListView.

Per farlo da adattatore,

public View getView(int position, View convertView, ViewGroup parent) 
{ 
if (//logic) { 
((ListView) parent).setItemChecked(position, true); 
} 
} 

Da attività/frammento

if (//logic) { 
listView.setItemChecked(position, true); 
}