Android ListView с несколькими выбираемыми и настраиваемыми адаптерами

У меня есть ListView с пользовательским адаптером. ListView допускает множественный выбор, но почему-то он не распознает, когда выбран элемент.

Я уже сделал элементы адаптера расширенными, но все же getCheckedItemPositions() возвращает массив фальцов.

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

Любая помощь приветствуется.

Код ниже:

Основной класс:

 listView = (ListView) findViewById(R.id.cardlist); tca = new TextCardAdapter(mInflater); listView.setAdapter(tca); 

адаптер:

 public class TextCardAdapter extends BaseAdapter { private int count = 0; private List<CheckableCard> cardList = new ArrayList<CheckableCard>(); private LayoutInflater mInflater; public TextCardAdapter(LayoutInflater inflater) { this.mInflater = inflater; } @Override public int getCount() { return count; } @Override public Object getItem(int position) { return cardList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.textlayout_row, null, false); convertView.setClickable(true); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.card_name); holder.checkbox = (CheckBox) convertView.findViewById(R.id.checkbox); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final CheckableCard card = cardList.get(position); holder.text.setText(card.card.toString()); holder.checkbox.setChecked(card.isChecked()); holder.checkbox.setOnClickListener(card.checkListener); convertView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { card.checkListener.onClick(v); holder.checkbox.setChecked(card.isChecked()); } }); return convertView; } public void add(Card card) { cardList.add(new CheckableCard(card)); count++; notifyDataSetChanged(); } public void addAll(Collection<Card> cardColl) { for (Card c : cardColl) add(c); } public void removeAll() { count = 0; cardList.clear(); notifyDataSetChanged(); } public Card getCard(int position) { CheckableCard cc = (CheckableCard) getItem(position); if (cc == null) return null; return cc.card; } public class CheckableCard implements Checkable { private boolean checked = false; public final Card card; public final OnClickListener checkListener; public CheckableCard(Card card) { this.card = card; checkListener = new OnClickListener() { @Override public void onClick(View v) { toggle(); } }; } @Override public boolean isChecked() { return checked; } @Override public void setChecked(boolean checked) { this.checked = checked; } @Override public void toggle() { checked = !checked; } } static class ViewHolder { TextView text; CheckBox checkbox; } } 

Solutions Collecting From Web of "Android ListView с несколькими выбираемыми и настраиваемыми адаптерами"

Просто попробуйте:

  1. listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

  2. holder.checkbox.setFocusable(false);

  3. Я думаю, что это представление подменю listView shoudld реализует интерфейс Checkable, то есть преобразованный View (convertView) должен иметь весь метод Checkable.

Однажды у меня была такая проблема. Это связано с тем, что у вас есть представление об адаптере, который выбирается, заставляя родителя игнорировать его. Удаление этого параметра позволяет вам снова выбрать строку списка. То, что вы создали, в основном кнопка на кнопке, андроиду это не нравится 🙁

У меня была аналогичная проблема. Представление элемента списка – это RealativeLayout с LinearLayout, содержащим CheckBox и TextView. Нет onItem … Listener был вызван до тех пор, пока я не установил CheckBox.focusable в false. Кроме того, объекты в адаптере должны быть Checkable, но представления, используемые в качестве макета для элемента списка.