2010-09-29 44 views
11

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.

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

Avez-vous trouvé une solution à ce problème? ? – kmalmur

+0

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/ –

+0

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

Répondre

9

juste un essai:

  1. listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

  2. holder.checkbox.setFocusable(false);

  3. Je pense que est sous shoudld de vue de l'élément du listView implémente l'interface Vérifiable, cela signifie que le converti View (convertView) doit avoir toute la méthode de Vérifiable.

2

J'ai eu un problème comme celui-ci une fois. Cela a quelque chose à voir avec le fait que vous avez une vue sur l'adaptateur qui est sélectionnable, ce qui amène le parent à l'ignorer. Le supprimer vous permet de sélectionner à nouveau la ligne de la liste. Qu'est-ce que vous avez créé est essentiellement un bouton sur un bouton, android n'aime pas cela :-(

0

J'ai eu un problème similaire.La vue de ma liste d'articles est un RealedLayout avec un LinearLayout contenant un CheckBox et un TextView. ... Listener a été appelé jusqu'à ce que je mette le CheckBox.focusable à false.En outre, les objets de l'adaptateur ne doivent pas être Checkable mais les vues utilisées comme layout pour l'élément de la liste