我有一个带有自定义适配器的ListView
。 ListView
允许多个选择,但不知何故,它无法识别何时选择了一个项目。
我已经使适配器项扩展为Checkable,但getCheckedItemPositions()
仍会返回一系列错误。
我想有一些基本的我做错了,但是到目前为止我还无法找到多个选择ListViews的示例,其中适配器不是使用多个选择的默认布局的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;
}
}
答案 0 :(得分:9)
试一试:
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
holder.checkbox.setFocusable(false);
我认为这是listView的子项视图shoudld实现了Checkable接口,这意味着转换后的View(convertView)应该具有Checkable的所有方法。
答案 1 :(得分:2)
我有一次像这样的问题。它与您可以选择的适配器视图这一事实有关,导致父级忽略它。删除它允许您再次选择列表视图的行。你创建的基本上是按钮上的按钮,android不喜欢: - (
答案 2 :(得分:0)
我有类似的问题。我的列表项视图是一个RealativeLayout,其中包含一个包含CheckBox和TextView的LinearLayout。没有onItem ...在我将CheckBox.focusable设置为false之前调用了Listener。此外,适配器中的对象不应该是Checkable,而是用作列表项布局的视图。