Estoy creando una aplicación para Android, donde tengo un ListView que muestra todas las aplicaciones que estaban instaladas en mi teléfono móvil.

Mi ListView es personalizado, se contiene un Icono, TextView y la Casilla de verificación, el uso del icono para mostrar el icono de la aplicación, TextView para mostrar el nombre de la aplicación, el uso de la Casilla de verificación para determinar qué elemento del ListView que he seleccionado.

¿Cómo puedo determinar cuál es la opción que he seleccionado en el ListView filas cuando hago clic en un botón en mi aplicación? Soy nuevo en Android, así que no sé lo que es el enfoque que debo hacer.

Aquí está mi código:

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);
}
}
  • usted puede escasa matriz de tipo boolean para este propósito.
  • ¿quieres que la casilla de verificación de los elementos seleccionados en la fila en el clic de un botón ? coz que el título dice «Get Elemento Seleccionado Usando la Casilla de selección en la vista de lista cuando hago clic en un Botón».

9 Comentarios

  1. 32

    Suponiendo que se desea obtener los elementos de la fila cuyas casillas de verificación están activadas en el clic de un botón. Hipótesis basada en su título «Get Elemento Seleccionado Usando la Casilla de selección en la vista de lista cuando hago clic en un Botón».

    De intentar el siguiente. Hacer sólo a los cambios como a continuación. Mantenga el resto de la misma.

    Explicación y debate sobre el tema @

    https://groups.google.com/forum/?fromgroups#!tema/android-desarrolladores/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 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 snap shot

    Obtener el Elemento Seleccionado Usando la Casilla de selección en la vista de lista

    • Se muestra el elemento de pan tostado si usted llega sólo a la última ?
    • este es un código de trabajo. no hay ningún problema con esto. Si usted tiene un problema de publicar una nueva pregunta en vez de comentar. Yo no puedo adivinar o sugerir lo que está mal sin ver el código
    • +1 Raghu, muy bien hecho
    • usted es bienvenido
    • Puedes por favor decirme dónde estás usando toggle?
    • No es ser llamado en cualquier lugar en el código de arriba 🙂
    • El método setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener) en el tipo de CompoundButton no es aplicable para los argumentos (CacheBoostAdapter) recibiendo este error en esta línea deleteBox.setOnCheckedChangeListener(este);
    • publica tu código por medio de una pregunta por separado
    • i m incapaz de publicar la pregunta puede pls u vienen en chat.stackoverflow.com/rooms/19132/java-and-android-era y el ping me voy a mostrar mi código y pregunta en pastie
    • Muchas gracias muy buen enfoque.. @Raghunandan

  2. 14

    Es una simplificación, pero es muy fácil…
    Usted necesita para agregar la seleccionable de la bandera de la casilla, como se ha escrito anteriormente.
    Es necesario también agregar el clickable bandera, como se muestra aquí:

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

    De control de la casilla de verificación estado desde dentro de la ListView (ListFragment en mi caso) onListItemClick evento.

    Esta la muestra onListItemClick método:

    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();
    }
    • en este caso desaparece el efecto de animación para Lollipop y versiones
  3. 8

    Usted tiene que añadir una OnItemClickListener para el listview para determinar qué elemento se ha hecho clic, 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);
    }
    });
  4. 2

    He tenido un problema similar. Xml proporcionado por ejemplo se pone como único ListViewItem, y yo no podía haga clic sobre el tema en sí, pero la casilla de verificación fue 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>

    Solución: añadir atributo

    android:focusable="false"

    para control de Casilla de verificación.

  5. 2

    hacer la casilla de verificación no seleccionable, y en la lista elemento, 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);
    }
    }
    }
    });
  6. 0

    [Personalizado ListView con la Casilla de verificación]

    Si customlayout uso de la casilla de verificación, debe establecer casilla seleccionable = 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 el Uso de ListActivity)

  7. 0

    «El uso de la casilla de verificación para determinar qué Elemento del Listview que he seleccionado»

    1. Acaba de añadir la etiqueta a la casilla de verificación usar setTag() método en el Adaptador de la clase. y del otro lado el uso de getTag() método.

            @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 sólo hay que poner el «android:onClick=»su método»atributo».

           <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 de Implementar 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);
      }
      }
      }
  8. 0

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

    Código fuente principal es la siguiente.

    Crear un modelo de clase primera

    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 el adaptador de la clase, setTags a la casilla de verificación. Utilizar esas etiquetas en onclicklistener de 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;
    }
    }
  9. 0

    Puede utilizar modelo de clase y el uso setTag() getTag() métodos para mantener un seguimiento de que los elementos del listview son revisados y los que no.

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

    Código fuente para modelo de

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

    todo el código 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;
    }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here