Android ListView con múltiples selecciones y adaptadores personalizados
Tengo un ListView
con un adaptador de encargo. El ListView
permite selección múltiple, pero de alguna manera no reconoce cuándo se selecciona un elemento.
Ya he hecho que los elementos del adaptador se extiendan Comprobable, pero aún así el getCheckedItemPositions()
devuelve una matriz de falsos.
- Cuando se desplaza un listview con un adaptador personalizado demasiado rápido arriba y abajo, getView () comienza a comportarse de manera extraña. ¿Por qué?
- ListView circular (elementos en el medio círculo)
- ListView personalizado para AlertDialog
- Cómo llamar a notifyDataSetChanged () desde un adaptador genérico
- Desplazar una Galería activa el estado presionado y elimina el escucha de clics de los sub-elementos
Supongo que hay algo fundamental que estoy haciendo mal, pero he sido incapaz hasta ahora de encontrar ejemplos de múltiples ListViews seleccionar donde el adaptador no era un ArrayAdapter usando el diseño por defecto para múltiples selecciones.
Cualquier ayuda sería muy apreciada.
El código está abajo:
Clase principal:
listView = (ListView) findViewById(R.id.cardlist); tca = new TextCardAdapter(mInflater); listView.setAdapter(tca);
Adaptador:
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; } }
- Por qué no puedo bloquear DrawerLayout con gravedad de diseño
- ¿Por qué la aplicación Android de Facebook se desplaza tan suavemente
- ¿Cómo se muestran 2 vistas en 1 actividad (android)?
- setEmptyView () no parece funcionar para (Sherlock) ListFragment
- Vaciar ListView dentro de ScrollView como dos Fragmentos
- OnCheckedChanged despedido varias veces, Listview con casilla de verificación
- Cómo mostrar los contactos en un listview en Android para Android api 11+
- Android ListView con botón no es seleccionable (clicable)
Sólo tiene un intento:
-
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
-
holder.checkbox.setFocusable(false);
-
Creo que es la vista del elemento secundario listView shoudld implementa la interfaz verificable, lo que significa que la vista convertida (convertView) debe tener todo el método de Checkable.
Tuve un problema como este una vez. Tiene algo que ver con el hecho de que tiene una vista en el adaptador que se puede seleccionar haciendo que el padre ignorarlo. Su eliminación le permite seleccionar de nuevo la fila de la vista de lista. Lo que has creado es básicamente un botón en un botón, android no le gusta eso 🙁
Tuve un problema similar. Mi vista de elemento de lista es un RealativeLayout con un LinearLayout que contiene un CheckBox y un TextView. No onItem … Listener fue llamado hasta que estableciera CheckBox.focusable a false. Además, los objetos del adaptador no deben ser verificables, pero las vistas se utilizan como diseño para el elemento de lista.