Получить выбранный элемент с помощью флажка в Listview

Я создаю приложение для Android, где у меня есть список, в котором отображаются все приложения, которые были установлены на моем мобильном телефоне

Мой Listview настроен, он содержит значок, текстовое поле и флажок, использование значка для отображения значка приложения, Textview – отображать имя приложения, использование этого флажка – определить, какой элемент в Listview, который я выбрал,

Как я могу определить, что такое флажок, который я выбрал в строках списка, когда я нажимаю кнопку в своем приложении? Я новичок в андроиде, поэтому не знаю, каков подход, который я должен делать

Вот мои коды

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

Solutions Collecting From Web of "Получить выбранный элемент с помощью флажка в Listview"

Предполагая, что вы хотите получить элементы строки, чьи флажки отмечены одним нажатием кнопки. Предположение, основанное на вашем заголовке «Получить выбранный элемент, используя флажок в списке, когда я нажимаю кнопку».

Попробуйте ниже. Внесите только изменения, как показано ниже. Остальное остальное.

Объяснение и обсуждение по теме @

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 с кнопкой в ​​бутоне

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

Вот щелчок

Введите описание изображения здесь

Это упрощение, но очень простое … Вам нужно добавить флаговый флаг к флажку, как было написано ранее. Вам также нужно добавить флаг clickable, как показано ниже:

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

Чем вы контролируете состояние флажка из ListFragment ListView ( ListFragment в моем случае) onListItemClick .

Это пример метода onListItemClick:

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

Вы должны добавить OnItemClickListener в listview, чтобы определить, какой элемент был нажат, а затем установите флажок.

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

У меня была схожая проблема. Если xml-образец помещен как единый ListViewItem, и я не мог щелкнуть по самому элементу, но флажок был рабочим.

 <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> 

Решение: добавить атрибут

 android:focusable="false" 

Для контроля CheckBox.

[Пользовательский ListView с CheckBox]

Если флажок customlayout используется, установите флажок 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: ListView с флажками (без использования ListActivity)

Сделайте этот флажок неактивным, а в элементе списка выберите это, здесь codevalue – это позиция.

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

«Использование флажка – определить, какой элемент в списке, который я выбрал»

  1. Просто добавьте тег к флажку с помощью метода setTag () в классе Adapter. И другую сторону, используя метод 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. В xml-коде флажка просто установите атрибут «android: onClick =» вашего метода ».

      <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. В вашем классе Внесите этот метод «ваш метод».

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

Полная ссылка на: listview с checkbox android studio Передать выбранные объекты в следующую активность

Основной исходный код приведен ниже.

Сначала создать класс модели

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

Затем в классе адаптера установите флажок SetTags. Используйте теги в onclicklistener флажка.

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

Вы можете использовать класс модели и использовать методы setTag () getTag (), чтобы отслеживать, какие элементы из списка просматриваются, а какие нет.

Больше ссылок для этого: listview с флажком в android

Исходный код модели

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

Поместите это в свой пользовательский адаптер

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

Весь код для customAdapter

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