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

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

Мой ListView настроен, он содержит значок, TextView и CheckBox, использование значка для отображения значка приложения, TextView должен отображать имя приложения, использование CheckBox – это определение того, какой элемент в ListView, который я выбрал.

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

Вот мой код:

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 { 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 pInfo = new ArrayList(); 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); } } 

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

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

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

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 pInfo = new ArrayList(); 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 с кнопкой в ​​бутоне

     

AppInfoAdapter

 public class AppInfoAdapter extends ArrayAdapter 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, и я не мог нажимать на Item сам, но флажок был workng.

      

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

 android:focusable="false" 

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

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

  Arraylist selectedschools=new Arraylist(); 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); } } } }); 

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

Если флажок customlayout используется, установите флажок focusable = false

      // <---important   

Readmore: ListView с флажками (без использования ListActivity)

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

  1. Просто добавьте тег к флажку с помощью метода setTag () в classе 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 =» вашего метода ».

       
  3. В вашем classе Реализуйте этот метод «ваш метод».

      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 Передать выбранные объекты в следующую активность

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

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

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

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

 public class CustomAdapter extends BaseAdapter { private Context context; public static ArrayList modelArrayList; public CustomAdapter(Context context, ArrayList 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; } } 

Вы можете использовать class модели и использовать методы 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 modelArrayList; public CustomAdapter(Context context, ArrayList 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; } } 
  • Почему ListView.getCheckedItemPositions () не возвращает правильные значения?
  • ListView OnItemClickListener не отвечает?
  • Android ListView child View setEnabled () и setClickable () ничего не делают
  • setEmptyView в ListView не показывает его вид в приложении для Android?
  • Получение значения цвета пикселя точки в Android-представлении, которая включает в себя canvas с поддержкой Bitmap
  • Android - динамически добавлять виды в представление
  • Показывать пустое представление, когда ListView пуст
  • ListView с OnItemClickListener android
  • Проблема с быстрым прокруткой с помощью ListAdapter и SectionIndexer
  • android: ViewPager и HorizontalScrollVIew
  • Что такое вид в Oracle?
  • Давайте будем гением компьютера.