Obtener el elemento seleccionado mediante la casilla de verificación en ListView

Estoy creando una aplicación de Android donde tengo una lista que muestra todas las aplicaciones que se instalaron en mi teléfono móvil

Mi ListView es personalizado, contiene un Icono, Textview y Checkbox, el uso del icono es para mostrar el icono de la aplicación, Textview es mostrar el nombre de la aplicación, el uso de la casilla es determinar qué artículo en El ListView que seleccioné,

¿Cómo puedo determinar cuál es la casilla de verificación que seleccioné en las filas listview cuando hago clic en un botón de mi aplicación? Soy nuevo en android, así que no sé cuál es el enfoque que debo hacer

Aquí están mis códigos

public class AppInfo { public Drawable icon; public String applicationName; public AppInfo(){ super(); } public AppInfo(Drawable icon, String applicationName){ super(); this.icon = icon; this.applicationName = applicationName; } } 

 import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; import android.app.Activity; import android.widget.CheckBox; public class AppInfoAdapter extends ArrayAdapter<AppInfo> { Context context; int layoutResourceId; AppInfo data[] = null; public AppInfoAdapter(Context context, int layoutResourceId, AppInfo[] data){ super(context, layoutResourceId,data); this.layoutResourceId = layoutResourceId; this.context = context; this.data = data; } @Override public View getView(int position, View convertView, ViewGroup parent){ View row = convertView; AppInfoHolder holder= null; if (row == null){ LayoutInflater inflater = ((Activity)context).getLayoutInflater(); row = inflater.inflate(layoutResourceId, parent, false); holder = new AppInfoHolder(); holder.imgIcon = (ImageView) row.findViewById(R.id.imgPackageIcon); holder.txtTitle = (TextView) row.findViewById(R.id.txtApplicationName); holder.chkSelect = (CheckBox) row.findViewById(R.id.chkSelect); row.setTag(holder); } else{ holder = (AppInfoHolder)row.getTag(); } AppInfo appinfo = data[position]; holder.txtTitle.setText(appinfo.applicationName); holder.imgIcon.setImageDrawable(appinfo.icon); holder.chkSelect.setChecked(true); return row; } } 

 import android.widget.ImageView; import android.widget.TextView; import android.widget.CheckBox; public class AppInfoHolder { ImageView imgIcon; TextView txtTitle; CheckBox chkSelect; } 

 import android.app.Activity; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import android.content.pm.PackageInfo; public class CacheActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_cache); final ListView listApplication = (ListView)findViewById(R.id.listApplication); ApplicationInfo applicationInfo = getApplicationInfo(); PackageManager pm = getPackageManager(); List<PackageInfo> pInfo = new ArrayList<PackageInfo>(); pInfo.addAll(pm.getInstalledPackages(0)); AppInfo app_info[] = new AppInfo[pInfo.size()]; int counter = 0; for(PackageInfo item: pInfo){ try{ applicationInfo = pm.getApplicationInfo(item.packageName, 1); app_info[counter] = new AppInfo(pm.getApplicationIcon(applicationInfo), String.valueOf(pm.getApplicationLabel(applicationInfo))); System.out.println(counter); } catch(Exception e){ System.out.println(e.getMessage()); } counter++; } AppInfoAdapter adapter = new AppInfoAdapter(this, R.layout.listview_item_row, app_info); listApplication.setAdapter(adapter); } } 

Suponiendo que desea obtener elementos de fila cuyas casillas de verificación están marcadas con el clic de un botón. Suposición basada en su título "Obtener el elemento seleccionado mediante la casilla de verificación en Listview cuando hago clic en un botón".

Intente lo siguiente. Realice los cambios siguientes. Mantenga el resto igual.

Explicación y discusión sobre el tema @

https://groups.google.com/forum/?fromgroups#!topic/android-developers/No0LrgJ6q2M

MainActivity.java

 public class MainActivity extends Activity { AppInfoAdapter adapter ; AppInfo app_info[] ; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ListView listApplication = (ListView)findViewById(R.id.listApplication); Button b= (Button) findViewById(R.id.button1); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub StringBuilder result = new StringBuilder(); for(int i=0;i<adapter.mCheckStates.size();i++) { if(adapter.mCheckStates.get(i)==true) { result.append(app_info[i].applicationName); result.append("\n"); } } Toast.makeText(MainActivity.this, result, 1000).show(); } }); ApplicationInfo applicationInfo = getApplicationInfo(); PackageManager pm = getPackageManager(); List<PackageInfo> pInfo = new ArrayList<PackageInfo>(); pInfo.addAll(pm.getInstalledPackages(0)); app_info = new AppInfo[pInfo.size()]; int counter = 0; for(PackageInfo item: pInfo){ try{ applicationInfo = pm.getApplicationInfo(item.packageName, 1); app_info[counter] = new AppInfo(pm.getApplicationIcon(applicationInfo), String.valueOf(pm.getApplicationLabel(applicationInfo))); System.out.println(counter); } catch(Exception e){ System.out.println(e.getMessage()); } counter++; } adapter = new AppInfoAdapter(this, R.layout.listview_item_row, app_info); listApplication.setAdapter(adapter); } } 

Activity_main.xml ListView con el botón en el buton

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ListView android:layout_width="fill_parent" android:id="@+id/listApplication" android:layout_height="fill_parent" android:layout_above="@+id/button1" android:text="@string/hello_world" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:text="Button" /> </RelativeLayout> 

AppInfoAdapter

 public class AppInfoAdapter extends ArrayAdapter<AppInfo> implements CompoundButton.OnCheckedChangeListener { SparseBooleanArray mCheckStates; Context context; int layoutResourceId; AppInfo data[] = null; public AppInfoAdapter(Context context, int layoutResourceId, AppInfo[] data){ super(context, layoutResourceId,data); this.layoutResourceId = layoutResourceId; this.context = context; this.data = data; mCheckStates = new SparseBooleanArray(data.length); } @Override public View getView(int position, View convertView, ViewGroup parent){ View row = convertView; AppInfoHolder holder= null; if (row == null){ LayoutInflater inflater = ((Activity)context).getLayoutInflater(); row = inflater.inflate(layoutResourceId, parent, false); holder = new AppInfoHolder(); holder.imgIcon = (ImageView) row.findViewById(R.id.imageView1); holder.txtTitle = (TextView) row.findViewById(R.id.textView1); holder.chkSelect = (CheckBox) row.findViewById(R.id.checkBox1); row.setTag(holder); } else{ holder = (AppInfoHolder)row.getTag(); } AppInfo appinfo = data[position]; holder.txtTitle.setText(appinfo.applicationName); holder.imgIcon.setImageDrawable(appinfo.icon); // holder.chkSelect.setChecked(true); holder.chkSelect.setTag(position); holder.chkSelect.setChecked(mCheckStates.get(position, false)); holder.chkSelect.setOnCheckedChangeListener(this); return row; } public boolean isChecked(int position) { return mCheckStates.get(position, false); } public void setChecked(int position, boolean isChecked) { mCheckStates.put(position, isChecked); } public void toggle(int position) { setChecked(position, !isChecked(position)); } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { mCheckStates.put((Integer) buttonView.getTag(), isChecked); } static class AppInfoHolder { ImageView imgIcon; TextView txtTitle; CheckBox chkSelect; } } 

Aquí está el disparo instantáneo

Introduzca aquí la descripción de la imagen

Es una simplificación, pero muy fácil … Necesita agregar el indicador que se puede enfocar a la casilla de verificación, como se escribió anteriormente. También es necesario agregar el indicador que se puede hacer clic, como se muestra aquí:

 android:focusable="false" android:clickable="false" 

Que controlas el estado de la casilla de verificación dentro del ListFragment ListView ( ListFragment en mi caso) onListItemClick .

Este es el método onListItemClick de la muestra:

 public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); //Get related checkbox and change flag status.. CheckBox cb = (CheckBox)v.findViewById(R.id.rowDone); cb.setChecked(!cb.isChecked()); Toast.makeText(getActivity(), "Click item", Toast.LENGTH_SHORT).show(); } 

Debe agregar un OnItemClickListener a la vista de lista para determinar qué elemento se ha hecho clic y, a continuación, busque la casilla de verificación.

 mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { CheckBox cb = (CheckBox) v.findViewById(R.id.checkbox_id); } }); 

Tuve un problema similar. Siempre que la muestra xml se pone como único ListViewItem, y no pude hacer clic en el propio artículo, pero la casilla de verificación era workng.

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="50dp" android:id="@+id/source_container" > <ImageView android:layout_width="40dp" android:layout_height="40dp" android:id="@+id/menu_source_icon" android:background="@drawable/bla" android:layout_margin="5dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/menu_source_name" android:text="Test" android:textScaleX="1.5" android:textSize="20dp" android:padding="8dp" android:layout_weight="1" android:layout_gravity="center_vertical" android:textColor="@color/source_text_color"/> <CheckBox android:layout_width="40dp" android:layout_height="match_parent" android:id="@+id/menu_source_check_box"/> </LinearLayout> 

El atributo de la oferta

 android:focusable="false" 

Al control CheckBox.

[ListView personalizado con CheckBox]

Si customlayout utiliza la casilla de verificación, debe establecer la casilla de verificación focusable = false

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/rowTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:textSize="16sp" > </TextView> <CheckBox android:id="@+id/CheckBox01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:layout_alignParentRight="true" android:layout_marginRight="6sp" android:focusable="false"> // <---important </CheckBox> </RelativeLayout> 

Readmore: Un ListView con casillas de verificación (sin utilizar ListActivity)

Haga que la casilla de verificación no se pueda enfocar y en el elemento de lista haga clic en hacer esto, aquí codevalue es la posición.

  Arraylist<Integer> selectedschools=new Arraylist<Integer>(); lvPickSchool.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int codevalue, long id) { CheckBox cb = (CheckBox) view.findViewById(R.id.cbVisitingStatus); cb.setChecked(!cb.isChecked()); if(cb.isChecked()) { if(!selectedschool.contains(codevaule)) { selectedschool.add(codevaule); } } else { if(selectedschool.contains(codevaule)) { selectedschool.remove(codevaule); } } } }); 

"El uso de la casilla de verificación es determinar qué elemento en el ListView que seleccioné"

  1. Simplemente agregue la etiqueta a la casilla de verificación mediante el método setTag () en la clase Adapter. Y otro lado usando el método getTag ().

      @Override public void onBindViewHolder(MyViewHolder holder, int position) { ServiceHelper helper=userServices.get(position); holder.tvServiceName.setText(helper.getServiceName()); if(!helper.isServiceStatus()){ holder.btnAdd.setVisibility(View.VISIBLE); holder.btnAdd.setTag(helper.getServiceName()); holder.checkBoxServiceStatus.setVisibility(View.INVISIBLE); }else{ holder.checkBoxServiceStatus.setVisibility(View.VISIBLE); //This Line holder.checkBoxServiceStatus.setTag(helper.getServiceName()); holder.btnAdd.setVisibility(View.INVISIBLE); } } 
  2. En el código xml de la casilla de verificación, coloque el atributo "android: onClick =" your method "".

      <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="checkboxClicked" android:id="@+id/checkBox_Service_row" android:layout_marginRight="5dp" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> 
  3. En su clase Implemente ese método "su método".

      protected void checkboxClicked(View view) { CheckBox checkBox=(CheckBox) view; String tagName=""; if(checkBox.isChecked()){ tagName=checkBox.getTag().toString(); deleteServices.add(tagName); checkboxArrayList.add(checkBox); }else { checkboxArrayList.remove(checkBox); tagName=checkBox.getTag().toString(); if(deleteServices.size()>0&&deleteServices.contains(tagName)){ deleteServices.remove(tagName); } } } 

Referencia completa presente en: listview con la casilla de verificación android studio Pasar los elementos seleccionados a la siguiente actividad

El código fuente principal es el siguiente.

Crear primero una clase de modelo

 public class Model { private boolean isSelected; private String animal; public String getAnimal() { return animal; } public void setAnimal(String animal) { this.animal = animal; } public boolean getSelected() { return isSelected; } public void setSelected(boolean selected) { isSelected = selected; } } 

A continuación, en la clase del adaptador, ajuste a la casilla de verificación. Utilice esas etiquetas en onclicklistener de la casilla de verificación.

 public class CustomAdapter extends BaseAdapter { private Context context; public static ArrayList<Model> modelArrayList; public CustomAdapter(Context context, ArrayList<Model> modelArrayList) { this.context = context; this.modelArrayList = modelArrayList; } @Override public int getViewTypeCount() { return getCount(); } @Override public int getItemViewType(int position) { return position; } @Override public int getCount() { return modelArrayList.size(); } @Override public Object getItem(int position) { return modelArrayList.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.lv_item, null, true); holder.checkBox = (CheckBox) convertView.findViewById(R.id.cb); holder.tvAnimal = (TextView) convertView.findViewById(R.id.animal); convertView.setTag(holder); }else { // the getTag returns the viewHolder object set as a tag to the view holder = (ViewHolder)convertView.getTag(); } holder.checkBox.setText("Checkbox "+position); holder.tvAnimal.setText(modelArrayList.get(position).getAnimal()); holder.checkBox.setChecked(modelArrayList.get(position).getSelected()); holder.checkBox.setTag(R.integer.btnplusview, convertView); holder.checkBox.setTag( position); holder.checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { View tempview = (View) holder.checkBox.getTag(R.integer.btnplusview); TextView tv = (TextView) tempview.findViewById(R.id.animal); Integer pos = (Integer) holder.checkBox.getTag(); Toast.makeText(context, "Checkbox "+pos+" clicked!", Toast.LENGTH_SHORT).show(); if(modelArrayList.get(pos).getSelected()){ modelArrayList.get(pos).setSelected(false); }else { modelArrayList.get(pos).setSelected(true); } } }); return convertView; } private class ViewHolder { protected CheckBox checkBox; private TextView tvAnimal; } } 

Puede utilizar la clase de modelo y utilizar los métodos setTag () getTag () para realizar un seguimiento de qué elementos de listview están marcados y cuáles no.

Más referencia para esto: listview con la casilla de verificación en android

Código fuente para el modelo

 public class Model { private boolean isSelected; private String animal; public String getAnimal() { return animal; } public void setAnimal(String animal) { this.animal = animal; } public boolean getSelected() { return isSelected; } public void setSelected(boolean selected) { isSelected = selected; } } 

Poner esto en su adaptador personalizado

  holder.checkBox.setTag(R.integer.btnplusview, convertView); holder.checkBox.setTag( position); holder.checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { View tempview = (View) holder.checkBox.getTag(R.integer.btnplusview); TextView tv = (TextView) tempview.findViewById(R.id.animal); Integer pos = (Integer) holder.checkBox.getTag(); Toast.makeText(context, "Checkbox "+pos+" clicked!", Toast.LENGTH_SHORT).show(); if(modelArrayList.get(pos).getSelected()){ modelArrayList.get(pos).setSelected(false); }else { modelArrayList.get(pos).setSelected(true); } } }); 

Código completo para customAdapter es

 public class CustomAdapter extends BaseAdapter { private Context context; public static ArrayList<Model> modelArrayList; public CustomAdapter(Context context, ArrayList<Model> modelArrayList) { this.context = context; this.modelArrayList = modelArrayList; } @Override public int getViewTypeCount() { return getCount(); } @Override public int getItemViewType(int position) { return position; } @Override public int getCount() { return modelArrayList.size(); } @Override public Object getItem(int position) { return modelArrayList.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.lv_item, null, true); holder.checkBox = (CheckBox) convertView.findViewById(R.id.cb); holder.tvAnimal = (TextView) convertView.findViewById(R.id.animal); convertView.setTag(holder); }else { // the getTag returns the viewHolder object set as a tag to the view holder = (ViewHolder)convertView.getTag(); } holder.checkBox.setText("Checkbox "+position); holder.tvAnimal.setText(modelArrayList.get(position).getAnimal()); holder.checkBox.setChecked(modelArrayList.get(position).getSelected()); holder.checkBox.setTag(R.integer.btnplusview, convertView); holder.checkBox.setTag( position); holder.checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { View tempview = (View) holder.checkBox.getTag(R.integer.btnplusview); TextView tv = (TextView) tempview.findViewById(R.id.animal); Integer pos = (Integer) holder.checkBox.getTag(); Toast.makeText(context, "Checkbox "+pos+" clicked!", Toast.LENGTH_SHORT).show(); if(modelArrayList.get(pos).getSelected()){ modelArrayList.get(pos).setSelected(false); }else { modelArrayList.get(pos).setSelected(true); } } }); return convertView; } private class ViewHolder { protected CheckBox checkBox; private TextView tvAnimal; } } 
  • ¿Cómo obtener un recuento de los elementos de la lista de Listview?
  • Actualización de Android GCM / Listview
  • Cómo deshabilitar un elemento secundario en un listview (hacer su color gris y unclickable)
  • Android: Actualizar ListView Items cada 1 minuto
  • Cómo agregar un elemento secundario en Android ListView?
  • Capturando el evento TextChanged dentro de un ListView en Android
  • Android dos listview verticalmente utilizando 50% -50% de la altura de la pantalla
  • Android Listview item Cambio después de 10 segundos automáticamente?
  • ListView onclick va a una nueva actividad
  • Recuperación de celdas de Android listView con celdas de tamaño variable
  • Android listview primera posición visible
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.