Android cómo identificar un elemento en la vista de lista con la checkbox

Estoy realmente atrapado aquí. Lo que quiero no es simple (para mí), sin embargo he estado progtwigndo Android desde hace un año. Lo que quiero es una vista de lista con una vista de imagen, una vista de texto, una checkbox y otra vista de texto en cada fila. Tengamos primero una vista de texto y una checkbox en el diseño. Basado en este tutorial logré hacer eso (hay muchos, pero este parece ser el mejor para mí). Tengo una vista de lista poblada con textviews y casillas de verificación.

Este es el resultado:

enter image description here

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

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

Entonces, cuando hago clic en Mercury, obtengo Mercury en la variable text_of_clicked_textview.

¿Pero cómo puedo verificar en qué checkbox hice clic? Por ejemplo, hago clic en la tercera checkbox, quiero ahora que está en la fila de la Tierra. Lo mejor sería si conozco tanto el texto de la vista de texto en la fila de la vista de lista ( Tierra ) como el número del elemento ( 3 ).

Supongo que tengo que configurar un OnClickListener en la checkbox, pero ¿qué sigue?

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

Esto es XML for Custom Row en ListView:

        

Esta es la actividad completa en la que se implementa la lista: simplemente copie esta actividad para probar y luego comprenda 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 list=new ArrayList(); 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 { LayoutInflater inflat; ViewHolder holder; public MyAdapter(Context context, int textViewResourceId, ArrayList 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 checkbox, también podría usar un ItemClickListener en su lista.

Consulte esta publicación para conocer la fila en la que se ha hecho clic: onItemClick strings.xml (no ListView / ArrayList)

Hay otras opciones, pero implica crear una clase de widget de fila personalizada y pasar su posición de fila cuando su adaptador la cree o la actualice.

Tendría que tener un onTouchListener en el contenedor que los contiene a todos y asegurarse de que devuelve false en sus oyentes para que no consumn el evento. onClickListener lo consume automáticamente.

Si solo te preocupa el texto y la checkbox, puedes usar esto

En XML:

  String[] color={"red","green","blue","white","yellow","cyan","purple","grey"}; list.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_multiple_choice, color)); 

Y en algún evento, verifique qué casillas de verificación están seleccionadas.

 SparseBooleanArray boolArray=list.getCheckedItemPositions(); int size=list.getCount(); for(int i=0;i