Android cómo identificar el elemento en listview con casilla de verificación

Estoy realmente atrapado aquí. Lo que quiero no es simple (para mí), sin embargo he estado programando android un año. Lo que quiero es una lista con una vista de imagen, una vista de texto, una casilla de verificación y otra vista de texto en cada fila. Vamos a tener una vista de texto y una casilla de verificación primero en el diseño. Basado en este tutorial logré hacer eso (hay mucho, pero esto parece ser lo mejor para mí). Tengo un listview poblado con textviews y checkboxes.

Este es el resultado:

introduzca la descripción de la imagen aquí

Así es como obtengo el texto de textview que hago clic en:

textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TextView tv = (TextView) v ; String text_of_clicked_textview = tv.getText().toString(); Log.i("TAG", "" + text_of_clicked_textview); } }); 

Así que cuando hago clic en Mercury, obtengo Mercury en la variable text_of_clicked_textview.

Pero, ¿cómo puedo comprobar en qué casilla he hecho clic? Por ejemplo, haga clic en la casilla de verificación 3, quiero ahora está en la fila de la Tierra. Lo mejor sería conocer el texto de textview en la fila del listview ( Earth ) y el número del elemento ( 3 ).

Supongo que tengo que establecer un onClickListener en la casilla de verificación, pero ¿qué sigue?

 checkBox.setOnClickListener( new View.OnClickListener() { public void onClick(View v) { CheckBox cb = (CheckBox) v ; } }); 

Esto es XML para fila personalizada en ListView:

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/camera_icon" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> <CheckBox android:id="@+id/checkBox1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" /> </LinearLayout> 

Esta es la Actividad Completa en la que List se implementa: Simplemente Copie esta Actividad para probar y luego entienda el código. Coloque una vista de lista en la actividad principal

 package com.DemoTest; import java.util.ArrayList; import java.util.List; import java.util.zip.Inflater; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class CustomList extends Activity implements OnClickListener { ListView listView; ArrayList<EachRow> list=new ArrayList<CustomList.EachRow>(); EachRow each; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); String[] color={"red","green","blue","white","yellow","cyan","purple","grey", "0red","0green","0blue","0white","0yellow","0cyan","0purple","0grey", "1red","1green","1blue","1white","1yellow","1cyan","1purple","1grey"}; for(String str : color) { each=new EachRow(); each.text=str; list.add(each); } listView=(ListView)findViewById(R.id.listView1); listView.setAdapter(new MyAdapter(this, 0, list)); //listView.setOnItemClickListener(this); } class MyAdapter extends ArrayAdapter<EachRow> { LayoutInflater inflat; ViewHolder holder; public MyAdapter(Context context, int textViewResourceId, ArrayList<EachRow> objects) { super(context, textViewResourceId, objects); // TODO Auto-generated constructor stub inflat=LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if(convertView==null) { convertView=inflat.inflate(R.layout.row_checkox, null); holder=new ViewHolder(); holder.textView=(TextView)convertView.findViewById(R.id.textView1); holder.image=(ImageView)convertView.findViewById(R.id.imageView1); holder.check=(CheckBox)convertView.findViewById(R.id.checkBox1); holder.check.setOnClickListener(CustomList.this); convertView.setTag(holder); } holder=(ViewHolder) convertView.getTag(); EachRow row= getItem(position); Log.d("size", row.text); holder.textView.setText(row.text); holder.check.setChecked(row.checkBool); holder.check.setTag(position); return convertView; } @Override public EachRow getItem(int position) { // TODO Auto-generated method stub return list.get(position); } private class ViewHolder { TextView textView; ImageView image; CheckBox check; } } private class EachRow { String text; boolean checkBool; } @Override public void onClick(View v) { // TODO Auto-generated method stub EachRow row=list.get((Integer)v.getTag()); row.checkBool=!row.checkBool; Log.d("item", "Item Click at "+(Integer)v.getTag()+" : "+row.text+" is "+row.checkBool); } } 

Mejor que agregar un onClickListener a cada casilla de verificación, también podría usar un ItemClickListener en su lista.

Consulte esta publicación para averiguar la fila que se ha hecho clic: onItemClick <string-array> strings.xml (no ListView / ArrayList)

Hay otras opciones, pero implica crear una clase de widget de fila personalizada y pasarla a su posición de fila cuando el adaptador la crea o la actualiza.

tendría que tener un onTouchListener en el contenedor que contiene todos ellos y asegúrese de que devuelve false en sus oyentes para que no consuman el evento. onClickListener lo consume automáticamente.

Si solo te interesa el texto y la casilla de verificación, puedes usar esta

En XML:

 <ListView android:id="@+id/listViewCursor" android:layout_width="fill_parent" android:layout_height="wrap_content" android:choiceMode="multipleChoice" > String[] color={"red","green","blue","white","yellow","cyan","purple","grey"}; list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, color)); 

Y en algún evento, marque las casillas de verificación seleccionadas.

 SparseBooleanArray boolArray=list.getCheckedItemPositions(); int size=list.getCount(); for(int i=0;i<size;i++) { if(boolArray.valueAt(i)==true) { Log.d("size", color[i]); } } 
  • Android: crea TextView (o EditText) de forma programática y lo configura en un lugar específico de la pantalla dando coordenadas
  • Android - epub reader para leer archivos .epub ..
  • Estilo conjunto de Android en el código
  • Scrollview es extremadamente lento en ics (android 4.0) cuando contiene una larga textview
  • Android textview html fuente tamaño etiqueta
  • Android- Ajusta el ancho de un TextView a la izquierda de cualquier botón-1 o botón-2
  • Justificar texto en la vista de texto
  • Verdaderamente el texto de alineación superior en Android TextView
  • ¿Hay una forma de realizar un seguimiento de esta excepción: la búsqueda de enfoque devolvió una vista que no pudo tomar el foco
  • EditText vs TextView
  • Android TextView con varias líneas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.