Android ListView with multiple select and custom adapter

帅比萌擦擦* 提交于 2019-12-19 05:16:52

问题


I have a ListView with a custom adapter. The ListView allows multiple select, but somehow it's not recognising when an item is selected.

I've already made the adapter items extend Checkable, but still the getCheckedItemPositions()returns an array of falses.

I guess there's something fundamental I'm doing wrong, but I have been unable so far to find examples of multiple select ListViews where the adapter was not an ArrayAdapter using the default layout for multiple selects.

Any help would be much appreciated.

Code is below:

Main class:

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

回答1:


Just have a try:

  1. listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

  2. holder.checkbox.setFocusable(false);

  3. I think that is the listView's sub item view shoudld implements the Checkable interface, that means the converted View(convertView) should have all the method of Checkable.




回答2:


I had a problem like this once. It has something to do with the fact that you have a view on the adapter that is selectable causing the parent to ignore it. Removing it allows you to select the row of the listview again. What you've created is basically a button on a button, android does not like that :-(




回答3:


I had a similar problem. My list item view is a RealativeLayout with a LinearLayout containing a CheckBox and a TextView. No onItem...Listener was called until I did set the CheckBox.focusable to false. Furthermore not the objects in the adapter should be Checkable but the views used as the layout for the list item.



来源:https://stackoverflow.com/questions/3825645/android-listview-with-multiple-select-and-custom-adapter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!