Подтвердить что ты не робот

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

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

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

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

Любая помощь будет высоко оценена.

Код ниже:

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

listView = (ListView) findViewById(R.id.cardlist);

tca = new TextCardAdapter(mInflater);
listView.setAdapter(tca);

Adapter:

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

Ответ 1

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

  • listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

  • holder.checkbox.setFocusable(false);

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

Ответ 2

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

Ответ 3

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