¿Cómo seleccionar un elemento ListView después de un clic largo?
Tengo un pequeño problema tonto. He registrado un ListFragment
tanto como OnItemClickListener
y OnItemLongClickListener
de su propio ListView
.
Cuando se onItemClick
evento onItemClick
, se onItemClick
una intención para la actividad de vista de detalle de ese elemento, sin problemas.
- Android: Cómo obtener la posición del texto desde el evento táctil
- Cómo obtener texto y valor seleccionados Android ListPreference
- Programatically fuego barra de acción elemento de menú en Android
- Android - obtener la selección de texto de EditText
- Obtener la aplicación seleccionada de Intent.createChooser
Cuando sucede el evento onItemLongClick
, quiero realizar lo siguiente:
- Crear un CAB
- Mantenga seleccionado el elemento presionado
Código:
@Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { if(this.cabMode != null) return false; this.cabMode = getActivity().startActionMode(editModeCallback); view.setSelected(true); return true; }
El CAB mostrará, sin embargo, la selección no permanecerá con el artículo.
Algunos bits y piezas, en caso de que sean relevantes: he leído sobre la fijación de este problema con las llamadas a view.requestFocusFromTouch()
o utilizando listView.setItemChecked()
, pero que no funcionó para mí. Además, las vistas de los elementos de lista se instancian desde un diseño personalizado, pero no tienen ningún oyente de evento personalizado adjunto.
Cualquier ayuda es apreciada. ¡Gracias!
- Los identificadores de selección no aparecen en WebView (Android 4.0-4.3)
- ¿Qué es el modo de selección de selección modal?
- Selección de Android Spinner
- Cómo obtener la selección de usuario de startActivityForResult (Intent.createChooser (fileIntent, "Abrir archivo utilizando ..."), APP_PICKED) ;?
- Cómo utilizar Android Spinner como una lista desplegable
- Establecer un color de fondo en un elemento ListView seleccionado en android
- ¿Cómo se puede cambiar el widget de selección de texto en pantalla?
- Detección de cambios de selección en WebView
Es posible, pero apenas apenas … en realidad no sé cómo una cosa tan simple puede terminar tan ridículamente complicado.
La clave de la respuesta se puede encontrar aquí: Android: mantener el fondo azul después de la selección ListView
Lo que se reduce a definir un estilo adicional que es utilizado por el ListView
y establecer el modo de elección a AbsListView.CHOICE_MODE_SINGLE
(como se explica en la respuesta vinculada).
Esto le permite alternar mediante programación la selección utilizando Listview.setItemChecked()
. Sin embargo, debe realizar un seguimiento del índice del elemento tocado en la onItemLongClick
llamada onItemLongClick
, porque ListView.setSelection()
no lo hará (al menos ListView.getSelectedItem()
siempre volverá -1 por lo que puedo ver ).
Código (para simplificar, mi fragmento implementa los tres OnItemClickListener
, OnItemLongClickListener
y ActionMode.Callback
):
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { this.listViewAdapter = new ListViewAdapter(); this.root = (ListView)inflater.inflate(R.layout.fragment_bookmarks, container, false); this.root.setAdapter(this.listViewAdapter); this.root.setOnItemClickListener(this); this.root.setOnItemLongClickListener(this); this.root.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); return this.root; } @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { if(this.cabMode != null) return false; this.selectedPosition = position; this.root.setItemChecked(position, true); this.root.setOnItemClickListener(null); this.cabMode = getActivity().startActionMode(this); return true; }
Y, por último, si desea deshacerse de la selección cuando el CAB está cerrado:
@Override public void onDestroyActionMode(ActionMode mode) { cabMode = null; this.root.setItemChecked(this.selectedPosition, false); this.selectedPosition = -1; this.root.setOnItemClickListener(this); }
Registrar y anular el registro de OnItemClickListener
asegura que mientras el CAB esté activo, no activará accidentalmente la acción normalmente asociada con el elemento (como abrir una vista de detalle).
Mi solución: (truco)
final ListView lvMain = (ListView) activity.findViewById(R.id.listTHEMES); lvMain.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); lvMain.setItemsCanFocus(false); ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity, android.R.layout.simple_list_item_multiple_choice, ArrayTheme); lvMain.setAdapter(adapter); lvMain.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int pos, long id) { // TODO Auto-generated method stub if (lvMain.isItemChecked(pos)){lvMain.setItemChecked(pos,false);}else{lvMain.setItemChecked(pos,true);} Log.v(LOG_TAG,"long clicked pos: " + pos); //lvMain.setSelection(); return true; } }); lvMain.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //Log.d(LOG_TAG, "itemClick: position = " + position + ", id = " + id); if (lvMain.isItemChecked(position)){lvMain.setItemChecked(position,false);}else{lvMain.setItemChecked(position,true);} } });
- API de Google Play que devuelve el error 401
- ¿Por qué está registrando IabBroadcastReceiver en Activity una mala idea?