Ho un ListView
con un adattatore personalizzato. Lo ListView
consente selezioni multiple, ma in qualche modo non riconosce quando viene selezionato un elemento.ListView Android con più scelte e adattatore personalizzato
Ho già esteso gli elementi dell'adattatore. Controllabile, ma lo getCheckedItemPositions()
restituisce un array di falsi.
Immagino che ci sia qualcosa di fondamentale che sto sbagliando, ma finora non sono stato in grado di trovare esempi di ListViews a selezione multipla in cui l'adattatore non era un ArrayAdapter che utilizza il layout predefinito per più selezioni.
Qualsiasi aiuto sarebbe molto apprezzato.
codice è qui sotto:
Classe principale:
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;
}
}
hai trovato qualche soluzione per questo problema ? – kmalmur
Ho trovato un metodo generico per risolvere il tipo di problema in una domanda di stackoverflow simile (http://stackoverflow.com/questions/2652109/multiple-choice-list-with-custom-view): http: // www. marvinlabs.com/2010/10/custom-listview-ability-check-items/ –
La mia soluzione alla fine è stata quella di archiviare l'elenco di CheckableCards e quando si recuperano tutte le carte verificate, iterando attraverso l'elenco e restituendo quelli restituiti isChecked() come true. – Pingless