J'ai un ListView
avec un adaptateur personnalisé. Le ListView
permet la sélection multiple, mais ne reconnaît pas quand un élément est sélectionné.Android ListView avec plusieurs choisir et adaptateur personnalisé
J'ai déjà fait en sorte que les éléments de l'adaptateur s'étendent Checkable, mais le getCheckedItemPositions()
renvoie un tableau de fausses. Je suppose qu'il y a quelque chose de fondamentalement mal fait, mais je n'ai pas encore trouvé d'exemples de listes ListView multiples où l'adaptateur n'était pas un ArrayAdapter utilisant la disposition par défaut pour plusieurs sélections.
Toute aide serait grandement appréciée.
codeest ci-dessous:
Classe principale:
listView = (ListView) findViewById(R.id.cardlist);
tca = new TextCardAdapter(mInflater);
listView.setAdapter(tca);
Adaptateur:
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;
}
}
Avez-vous trouvé une solution à ce problème? ? – kmalmur
J'ai trouvé une méthode générique pour résoudre votre genre de problème dans une question similaire stackoverflow (http://stackoverflow.com/questions/2652109/multiple-choice-list-with-custom-view): http: // www. marvinlabs.com/2010/10/custom-listview-ability-check-items/ –
Ma solution a finalement été de stocker la liste des CheckableCards, et lors de la récupération de toutes les cartes vérifiées, en parcourant la liste et en retournant celles qui ont retourné isChecked() comme vrai. – Pingless