ListView OnItemLongClickListener () not starting

I have a class that extends ListActivity, where list items respond to OnClick events. Adding OnItemLongClickListener does not work. The onItemLongClick () function is not called (log output or Toast is not displayed), but the regular OnClick () event is processed instead.

I want to display a context action bar with a long press. A minimal example of using my code in a new project works fine. So my question is: what can prevent the onItemLongClick () trigger from starting?

My minimum API is 11. I also set listView to longClickable="true" .

Operation code (selected functions):

 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> 
+6
source share
3 answers

When using ListActivity or ListFragment there is no method that you can override for a long click, and accessing the ListView is not possible in onCreateView (), since it is controlled by the parent class.

So, to overcome this, I did this, since the getListView () command would not work until the view was created:

 @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 } }); } 
+1
source

If you have buttons that respond to onClick() events inside your list, you need to set the following buttons in the container:

 android:descendantFocusability="blocksDescendants" 

If you have text reviews, the problem is a little more complicated. See the following: Focused EditText inside a ListView

+5
source

This answer does not solve the question user1, but the symptoms were similar to my problem (i.e. OnItemClickListener was called, but OnItemLongClickListener not). I am posting my answer here if someone else stumbles on this question, as I did, trying to solve my problem.

I used ListView inside the fragment and implemented listener methods:

 public class MyFragment extends Fragment implements OnClickListener, OnLongClickListener, OnItemClickListener, OnItemLongClickListener { 

Here is the onItemClick method that worked fine:

 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long rowId) { Log.i("Chimee", "short click working"); } 

And here is the onItemLongClick method that did not work:

 @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long rowId) { Log.i("Chimee", "Long click working"); return false; } 

Of course, the simple answer was that I forgot the setOnItemLongClickListener . I added it after setOnItemClickListener , which I had all the time, and then it worked fine.

 @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 ... } 
+2
source

Source: https://habr.com/ru/post/959061/