2012-09-28 38 views
15

Estoy cargando contactos telefónicos en un ListView personalizado. Cada fila es un LinearLayout seleccionable que contiene un CheckedTextView y otro TextView.No se puede marcar/desmarcar CheckedTextView dentro de getView

Estoy alimentando la vista de lista con un ArrayAdapter personalizado. Mi problema es que no puedo controlar CheckedTextViews dentro de getView(). Por ejemplo cuando intento el siguiente

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

que se supone que comprobar cada vista de texto cada vez que desplazarse por la vista de lista, pero eso no está sucediendo. ¿Alguien puede decirme cómo hacerlo?

EDIT: Es importante comprobar que el interior getView(), que no sólo puede comprobar todos después setListAdapter()

Edit2: Este es el archivo XML que muestra la vista de cada fila

<?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 es un diseño personalizado que extiende LinearLayout e implementa Checkable como dije antes. Y lo he tomado de here

+0

Yo no lo necesito para ser activada de forma predeterminada. En realidad, el código anterior no es mi código real, es solo una muestra que demuestra mi problema. Todo lo que necesito es poder alternar un CheckedTextView dentro de getView() –

+0

¿puedes publicar el xml –

+0

Tienes el diseño con 'casilla de verificación' pero cuando presionas la casilla de verificación' no marca? –

Respuesta

26

¿Ha establecido una propiedad checkMark para su CheckedTextView en su diseño xml?

Por ejemplo: android:checkMark="?android:attr/listChoiceIndicatorMultiple

CheckedTextView no es sólo una casilla con un texto. También se debe señalar, que CheckedTextView no enfocable, o se puede hacer clic y sin manipulación alguna (ya que fue diseñado para ListView y por lo tanto su estado debe ser controlada por ListView de setOnItemClickListener)

setChoiceMode se debe establecer para un ListView. Y la comprobación de la fila dentro del getView del adaptador debe hacerse a través de: listView.setItemChecked(position, value)

+0

Lo hice. Y se marca/desactiva normalmente cuando presiono un elemento yo mismo. Es solo dentro de getView() que se comporta así. –

+0

Entonces, ¿se puede controlar solo en setOnItemClickListener? no hay forma de alternarlo fuera de él? –

+0

¿Dónde debe escribirse este fragmento de código? Estoy intentando alternar el checkTextView automáticamente, no cuando se lanza un evento onClick. Ya implementé onListItemClick y funciona bien. –

1

Cuando se desplaza la lista, cada vez que llama a su método getview(). Por lo tanto, si tiene una casilla de verificación o cualquier cuadro de edición en listcell, lo reinicializará.

Mi idea es almacenar el estado (marcado o no) de la casilla de verificación. Así que aquí utilicé ArrayList primero, lo llené con valor falso y luego en su evento de clic que usé para almacenarlo.

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

      } 
     } 
    } 

Actualización: Solución 2: Puedes poner una variable booleana en tu clase ViewHolder. Esta variable booleana se usará para definir si el elemento está seleccionado o no.

Espero que esto te ayude.

+0

checkBox.setChecked (checks.get (position)); ¿Eso es trabajar contigo? es checkBox de tipo CheckedTextView o solo una casilla de verificación? –

+0

@IslamHassan sí está trabajando de mi lado. Aquí mi casilla de verificación es de tipo Botón. –

1

@ Pier-Luc Gendreau y @fox mencionaron la solución en los comentarios pero no en la respuesta, por lo que publicaron la respuesta en su nombre.

Según lo mencionado por @AlexOrlov, CheckedTextView no se puede enfocar ni hacer clic sin una cierta manipulación. Entonces, lo que tienes que hacer es establecer la verificación del elemento usando ListView, puedes hacerlo desde el adaptador mismo o desde la actividad/fragmento donde tienes ListView.

Para hacerlo desde el adaptador,

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

de la actividad/fragmento

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