¿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.

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!

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);} } }); 
  • Android: smoothScrollToPosition () no funciona correctamente
  • Selección de texto de Webview no borrada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.