Android ListView avec plusieurs sélection et adaptateur personnalisé
J'ai un ListView
avec un adaptateur personnalisé. Le ListView
permet la sélection multiple, mais de toute façon c'est de ne pas reconnaître quand un élément est sélectionné.
J'ai déjà fait la carte des éléments de prolonger Vérifiable, mais encore la getCheckedItemPositions()
retourne un tableau de falses.
Je pense qu'il y a quelque chose de fondamental que je fais mal, mais j'ai été pas si loin pour trouver des exemples de plusieurs sélectionnez ListViews où la carte n'était pas un ArrayAdapter à l'aide de la mise en page par défaut pour plusieurs sélectionne.
Toute aide serait grandement appréciée.
Code est 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;
}
}
source d'informationauteur Pingless
Vous devez vous connecter pour publier un commentaire.
Ayez juste un essai:
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
holder.checkbox.setFocusable(false);
Je pense que c'est la liste de la sous-rubrique afficher shoudld met en œuvre la Vérifiables de l'interface, cela signifie que le converti Vue(convertView) doit avoir toutes les méthode de Vérifiable.
J'ai eu un problème comme ça une fois. Il a quelque chose à voir avec le fait que vous avez une vue sur la carte qui est sélectionnable par l'origine du parent de l'ignorer. Retrait il vous permet de sélectionner la ligne de la liste de nouveau. Ce que vous avez créé est en fait un bouton sur un bouton, android n'est pas comme ça 🙁
J'ai eu un problème similaire. Mon élément de la liste d'affichage est un RealativeLayout avec un LinearLayout contenant une Case à cocher et un TextView. Pas de onItem...Écouteur a été appelé jusqu'à ce que je n'ai activez la Case à cocher.peut recevoir le focus sur false. En outre, et non pas les objets que l'adaptateur doit être Vérifiable, mais le point de vue utilisé comme la mise en page de l'élément de la liste.