Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Activar / Desactivar selección de elementos en listview en modo de opción múltiple

Tengo un listview registrado para el menú contextual en el modo de opción múltiple:

private void initListViewForContextMenu(){ log.d("FilesFragment", "initListViewForContextMenu()"); ListView listView = getListView(); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); listView.setMultiChoiceModeListener(new MultiChoiceModeListener() { ... 

El problema es que no todos los elementos de mi vista deben ser seleccionables, sólo los que muestran un icono especial debe estar disponible para la selección. No sé cómo implementar esto, he definido un OnItemLongClickListener :

 getListView().setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> adapter, View view, int position, long id) { Log.d("FilesFragment", "OnItemLongClickListener.onItemLongClick at pos " + position); PfmDocument doc = (PfmDocument)adapter.getItemAtPosition(position); if (doc.isOnBasket()){ Log.d("FilesFragment", "OnItemLongClickListener.onItemLongClick detected in basket"); ListView lv = (ListView) adapter; lv.setItemChecked(position, false); } return false; } }); 

Pero este oyente nunca se llama.

También he intentado establecer un OnLongClickListener a la vista de fila en el adaptador, pero haciendo esto, el clic normal también se deshabilita incluso cuando el menú contextual está cerrado (no en el modo de selección).

 if (doc.isOnBasket()){ rowView.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { return false; // do nothing, already in basket } }); 

//}

One Solution collect form web for “Activar / Desactivar selección de elementos en listview en modo de opción múltiple”

Si usted cavar en el código fuente de android (AbsListview), verá que establecer el choiceMode a MULTIPLE_MODAL se hará cargo de la prestación de tiempo. Es por eso que su oyente nunca se llama.

Puede decidir si se puede hacer clic en una vista para devolver true / false en isEnabled(position) en su adaptador.

El código siguiente sólo resuelve la parte en la que durante el modo de acción, los elementos que ya se han agregado a la cesta no se pueden hacer clic.

Pero debería ser bastante fácil simplemente desmarcar el elemento que está presionado si no es un elemento válido.

¡Espero que esto ayude!

En su MultiChoiceModeListener:

 @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { this.adapter.setActionMode(true); return true; } @Override public void onDestroyActionMode(ActionMode mode) { this.adapter.setActionMode(false); } 

Y luego en su adaptador personalizado:

 public abstract class AbstractCollectionAdapter extends AbstractCursorAdapter { private boolean isActionMode; public AbstractCollectionAdapter(Context context) { super(context); this.isActionMode = false; } @Override public boolean isEnabled(int position) { if (this.isActionMode) { final Object item = this.getItem(position); if (!item.isInBasket()) { //only enable items that are not inside the basket return true; } //all other items are disabled during actionmode return false; } //no actionmode = everything enabled return true; } public void setActionMode(boolean isActionMode) { this.isActionMode = isActionMode; } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.