2010-09-29 20 views
11

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

hai trovato qualche soluzione per questo problema ? – kmalmur

+0

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

+0

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

risposta

9

Basta avere una prova:

  1. listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

  2. holder.checkbox.setFocusable(false);

  3. penso che è sub vista dell'elemento shoudld del listView implementa l'interfaccia ispezionabile, che significa che il fabbricato Vista (convertView) dovrebbe avere tutto il metodo di controllabile.

2

Ho avuto un problema come questo una volta. Ha qualcosa a che fare con il fatto che si ha una vista sull'adattatore che è selezionabile causando il genitore di ignorarlo. Rimuovendolo consente di selezionare nuovamente la riga della listview. Quello che hai creato è fondamentalmente un pulsante su un pulsante, Android non mi piace :-(

0

Ho avuto un problema simile.La mia vista di lista è un RealativeLayout con un LinearLayout che contiene un CheckBox e un TextView. ... Il listener è stato chiamato finché non ho impostato CheckBox.focusable su false, inoltre gli oggetti nell'adattatore non dovrebbero essere verificabili ma le viste utilizzate come layout per la voce di elenco.

Problemi correlati