ListView OnItemLongClickListener () no activado
Tengo una clase que extiende ListActivity donde los artículos de la lista responden a los acontecimientos de OnClick. La adición de OnItemLongClickListener no funciona. No se llama a la función onItemLongClick () (no se muestra ningún log-output o Toast), sino que se controla el evento OnClick () normal.
Quiero mostrar una barra de acción contextual al hacer clic largo. Un ejemplo mínimo utilizando mi código en un nuevo proyecto funciona bien. Así que mi pregunta es: ¿Qué puede evitar que el disparador onItemLongClick () se dispare?
- Cómo agregar un hijo a un padre particular en el listview expandible android
- ¿Hay alguna manera de probar las pestañas personalizadas de Chrome con Espresso?
- ListView vs LinearLayout
- ¿Cómo acceder a `this` dentro de un renderRow de un ListView?
- Problema en un grupo de vistas personalizado al actualizar ListViews
Mi API mínima es 11. También estoy configurando el listView a longClickable="true"
.
Código de actividad (funciones seleccionadas):
public class EventListActivity extends ListActivity { private ArrayList<Event> arrEvents = null; private ArrayAdapter<Event> adpEvents = null; private ActionMode mActionMode = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // only create list adapter and set it arrEvents = new ArrayList<Event>(); adpEvents = new ArrayAdapter<Event>(this, android.R.layout.simple_list_item_activated_2, android.R.id.text1, arrEvents) { @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView text1 = (TextView) view.findViewById(android.R.id.text1); TextView text2 = (TextView) view.findViewById(android.R.id.text2); text1.setText(arrEvents.get(position).getTitle()); text2.setText(arrEvents.get(position).getDateTimeFormatted()); return view; } }; setListAdapter(adpEvents); // add CAB to ListView setupCAB(); } @Override protected void onResume() { super.onResume(); // populate list and refresh adapter createEventList(); adpEvents.notifyDataSetChanged(); // if list empty show emtpy msg, otherwise hide it setContentView(R.layout.activity_event_list); TextView empty = (TextView) findViewById(R.id.text_empty); if(arrEvents.isEmpty()) { empty.setVisibility(View.VISIBLE); } else { empty.setVisibility(View.GONE); } } private void setupCAB() { // Important: to select single mode getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { // Called when the user long-clicks an item on the list @Override public boolean onItemLongClick(AdapterView<?> parent, View row, int position, long rowid) { Log.w("EventListActivity", "Long click detected!"); Toast.makeText(EventListActivity.this, "Long click detected!", Toast.LENGTH_SHORT).show(); if (mActionMode != null) { return false; } // Important: to mark the editing row as activated getListView().setItemChecked(position, true); // Start the CAB using the ActionMode.Callback defined above mActionMode = EventListActivity.this.startActionMode(mActionModeCallback); return true; } }); } private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { // Called when the action mode is created; startActionMode() was called @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // Inflate a menu resource providing context menu items MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.event_context, menu); return true; } // Called when the user enters the action mode @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { // Disable the list to avoid selecting other elements while editing one EventListActivity.this.getListView().setEnabled(false); return true; // Return false if nothing is done } // Called when the user selects a contextual menu item @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.mnu_share_event: //TODO share event mode.finish(); return true; default: return false; } } // Called when the user exits the action mode @Override public void onDestroyActionMode(ActionMode mode) { // Re-enable the list after edition EventListActivity.this.getListView().setEnabled(true); mActionMode = null; } }; }
Activity_event_list.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".EventListActivity" > <TextView android:id="@+id/text_empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="45dp" android:text="@string/empty" android:textAppearance="?android:attr/textAppearanceLarge" android:visibility="gone" /> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:longClickable="true" > </ListView> </RelativeLayout>
- Cómo utilizar addHeaderView para agregar un ImageView simple a un ListView
- Adición dinámica de elementos a la vista de lista mediante el adaptador personalizado para la aplicación de Android
- Eliminar el encabezado de listView
- Android - autoLink
- ¿Cómo implementar una lista interminable con RecyclerView?
- ListView con CustomCursorAdapter desplazamiento no es suave
- Sólo en algunos teléfonos, ListView no se actualiza después de notifyDataSetChanged ()
- Android ListView agrega elementos a la parte superior sin vista de lista desplácese
Cuando se utiliza ListActivity o ListFragment no hay ningún método que se pueda reemplazar por el clic largo, y el acceso a ListView no es posible en onCreateView (), ya que está siendo controlado por la clase padre.
Por lo tanto, para superar esto, lo hice, ya que el comando getListView () no funcionará hasta después de crear la vista:
@Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mRecipeListView = this.getListView(); mRecipeListView.setOnItemLongClickListener(new ListView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> arg0, View view, int position, long row_id) { // Process the long-click } }); }
Si tiene botones que responden a eventos onClick()
dentro de su listview, debe configurar lo siguiente en el contenedor que contiene los botones:
android:descendantFocusability="blocksDescendants"
Si lo que tienes son textviews, el problema es un poco más complicado. Vea esto: Focusable EditText dentro de ListView
Esta respuesta no resuelve la pregunta del usuario1, pero los síntomas eran similares a mi problema (es decir, OnItemClickListener
estaba llamando pero OnItemLongClickListener
no lo era). Estoy publicando mi respuesta aquí en caso de que alguien tropiece con esta pregunta como lo hice al intentar resolver mi problema.
Yo estaba usando un ListView dentro de un fragmento e implementado los métodos de escucha:
public class MyFragment extends Fragment implements OnClickListener, OnLongClickListener, OnItemClickListener, OnItemLongClickListener {
Aquí está el método onItemClick
que funcionaba bien:
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long rowId) { Log.i("Chimee", "short click working"); }
Y aquí está el método onItemLongClick
que no estaba disparando:
@Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long rowId) { Log.i("Chimee", "Long click working"); return false; }
Por supuesto la respuesta simple fue que me olvidé de setOnItemLongClickListener
. Lo añadí después de la setOnItemClickListener
que tenía todo el tiempo y luego funcionó bien.
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.my_fragment, container, false); lvSuggestions = (ListView) v.findViewById(R.id.lvSuggestions); lvSuggestions.setChoiceMode(ListView.CHOICE_MODE_SINGLE); lvSuggestions.setOnItemClickListener(this); lvSuggestions.setOnItemLongClickListener(this); // Forgot this ... }
- Convertir la fecha JSON en el formato "mm dd aaaa"
- Android: Cómo rellenar un ListView con el indexador de alfabeto y fastscroll como en la aplicación de contactos.