Android带有多选和自定义适配器的ListView

12

我有一个带有自定义适配器的 ListView。该 ListView 允许多选,但它似乎无法识别何时选择了项目。

我已经使适配器项扩展了 Checkable,但仍然使用 getCheckedItemPositions()返回谎言数组。

我猜我做错了一些基本的事情,但迄今为止,我无法找到其适配器不是 ArrayAdapter 的多个选择 ListView 示例,后者使用默认布局进行多个选择。

任何帮助都将不胜感激。

以下是代码:

主类:

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

我在类似的stackoverflow问题(https://dev59.com/V3E85IYBdhLWcg3wtVxT)中找到了一个通用方法来解决你这种问题:http://www.marvinlabs.com/2010/10/custom-listview-ability-check-items/。 - ol_v_er
你找到这个问题的解决方案了吗? - kmalmur
我的解决方案最终是存储CheckableCards列表,当检索所有选中卡片时,迭代列表并返回isChecked()为真的卡片。 - Pingless
@Pingless 请查看这个答案,它可能会有所帮助:https://dev59.com/wXbZa4cB1Zd3GeqPBhOd#20171191 - Chanakya Vadla
3个回答

9

试试看:

  1. listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

  2. holder.checkbox.setFocusable(false);

  3. 我认为listView的子项视图应该实现Checkable接口,这意味着转换后的View(convertView)应该具有Checkable的所有方法。


2

我曾经遇到过类似的问题。这与您在适配器上有一个可选择的视图有关,导致父视图忽略它。删除它可以再次选择列表视图的行。您所创建的基本上是一个按钮上的按钮,Android 不喜欢这样做 :-(


0
我曾经遇到过类似的问题。我的列表项视图是一个RelativeLayout,其中包含一个LinearLayout,其中包含一个CheckBox和一个TextView。在将CheckBox.focusable设置为false之前,没有调用onItemClickListener。此外,适配器中的对象不应该是可选的,而是用作列表项布局的视图应该是可选的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接