style studio sirve que para android android-layout android-spinner android-checkbox

android - studio - No se puede marcar/desmarcar CheckedTextView dentro de getView



android studio checkedtextview (3)

¿Estableciste una propiedad checkMark para tu CheckedTextView en tu diseño xml?

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

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

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

Estoy cargando los contactos del teléfono en un ListView personalizado. Cada fila es un LinearLayout seleccionable 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; }

Se supone que debe comprobar cada vista de texto cada vez que me desplazo por la vista de lista, pero eso no sucede. ¿Alguien puede decirme cómo hacerlo?

EDITAR: es importante verificarlo dentro de getView (), no puedo verificar 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 dije anteriormente. Y lo he tomado de here


@ 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.

Como lo mencionó @AlexOrlov, CheckedTextView no se puede enfocar o hacer clic sin una cierta manipulación. Entonces, lo que tiene que hacer es configurar la comprobación de elementos utilizando ListView, puede hacerlo desde el propio adaptador o desde la actividad / fragmento donde tiene 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); }


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

Mi idea es almacenar el estado (activado o desactivado) de la casilla de verificación. Así que aquí usé ArrayList, primero lo llené con un valor falso y luego, en su evento de clic, lo usé para almacenarlo en el 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.