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
- Diferencia entre getView y getDropDownView en SpinnerAdapter
- El NetworkImageView de Volley no aparece en Spinner
- El tema de Spinner es oscuro en Android
- Problema de estilo al superponer getDropDownView en ArrayAdapter
- Android personalizado IcsSpinner (de ActionBarSherlock)
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í
- Estilo de la barra de desplazamiento de Spinner
- Carga de spinner sqlite con texto y valor
- Agregar OnItemSelectedListener a Spinner
- Android- ¿Cómo utilizar Spinner en un AlertDialog?
- Spinner: obtener estado o recibir notificación cuando se abre
- Spinner causa error al usar estilo personalizado
- ¿Cómo crear un spinner con título en él?
- Error al insertar android.database.sqlite.sqliteconstraintexception error código 19 restricción fallida
¿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); }
- ¿Puedo tener una actividad de Android ejecutada sólo la primera vez que se abra una aplicación?
- ¿Es "AndroidAnnotaions" fiable?