No se puede marcar / desmarcar CheckedTextView dentro de getView

Estoy cargando contactos de teléfono en un ListView personalizado. Cada fila es un LinearLayout comprobable que contiene un CheckedTextView y otro TextView.

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 lo 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 para comprobar cada vista de texto cada vez que desplaza la vista de lista, pero eso no está sucediendo. ¿Puede alguien decirme cómo hacerlo?

EDIT: Es importante comprobarlo dentro de getView (), no puedo comprobar todo después de 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 he dicho antes. Y lo he tomado de aquí

¿Configuró una propiedad checkMark para su CheckedTextView en su xml de diseño?

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

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

setChoiceMode debe establecerse para un ListView. Y la comprobación de la fila dentro del adaptador getView se debe hacer vía: listView.setItemChecked(position, value)

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

Mi idea es almacenar el estado (marcado o no) de la casilla de verificación. Así que aquí he utilizado ArrayList primero lo llené con valor falso, a continuación, en su evento de clic i utilizado para almacenar su estado real.

  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ª: Puede poner una variable booleana en su clase ViewHolder. Esta variable booleana se utilizará para definir si el elemento está seleccionado o no.

Espero que esto te ayude.

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

Como se mencionó por @AlexOrlov, CheckedTextView no se puede enfocar, o puede hacer clic sin manipulación alguna. Así que lo que tienes que hacer es establecer la comprobación de elementos con ListView, lo puedes hacer desde el propio adaptador o de 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 actividad / fragmento

 if (//logic) { listView.setItemChecked(position, true); } 
  • Android: Dibujo de un botón como spinner
  • IPhone como Spinner para Android
  • ¿La mejor manera de mostrar un indicador de carga / avance?
  • Cambie el color del texto del hilandero del holo
  • el color de texto del hilandero es blanco?
  • Cómo ordenar HashMap como agregado en Android con ArrayAdapter
  • La posición 0 no se selecciona en Spinner en Android
  • Cambios en la posición emergente de Spinner en el Nexus 5 (android 5.0)
  • Multi spinner de selección en android sin AlertDialog
  • ¿Cómo actualizar dinámicamente un spinner?
  • Cambiar el color de fondo de la flecha giratoria
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.