androidlistviewcontextual-action-barmultichoiceitems

First long click is ignored in listview


I'm trying to build a listview that, when the user long clicks an item, shows the Contextual Action Bar (CAB) and lets the user select multiple items. The only issue I'm running into is that the first long click on an item is ignored and only from the second long click onward is the CAB shown.

My code:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_notification_list);
    mLv = (ListView) findViewById(R.id.listview_notifications);
    mCtx = this;

    ...

    mLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
            final CustomNotification notification = (CustomNotification) mAdapter.getItem(position);
            new AlertDialog.Builder(NotificationListActivity.this)
                    .setTitle(notification.getScope())
                    .setMessage(notification.getMessage())
                    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            if(notification.getReadDate().isEmpty()){
                                //Mark local notification as read
                                ContentResolver cr = getContentResolver();
                                DateTime dateTime = new DateTime(DateTimeZone.getDefault());
                                ContentValues values = new ContentValues();
                                values.put(CustomNotification.COL_READ_DATE, dateTime.toString());

                                String selection = CustomNotification.COL_NOTIFICATION_ID + "=" + notification.getNotificationID();
                                cr.update(CustomNotification.getContentUri(), values, selection, null);

                                Intent i = new Intent(Constants.BROADCAST_GCM_SINGLE_NOTIFICATION_READ);
                                sendBroadcast(i);
                            }
                            dialog.dismiss();
                        }
                    })
                    .create()
                    .show();
        }
    });

    mLv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            mLv.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
            mLv.setMultiChoiceModeListener(new modeCallBack());
            return true;
        }
    });

    mLv.setEmptyView(findViewById(R.id.notification_listview_empty));
}

My MultiChoiceListener implementation:

private class modeCallBack implements ListView.MultiChoiceModeListener{

        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
            if(checked){
                mAdapter.addSelectedItem((CustomNotification) notificationArray.get(position));
            }else{
                mAdapter.removeSelectedItem((CustomNotification) notificationArray.get(position));
            }
            mAdapter.notifyDataSetChanged();
        }

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            mAdapter.setActionMode(mode);
            mode.getMenuInflater().inflate(R.menu.notifications_selected_actions, menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return true;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
            mAdapter.setActionMode(null);
            mAdapter.removeAllSelectedItems();
        }
}

Solution

  •      mLv.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
         mLv.setMultiChoiceModeListener(new modeCallBack());
    

    These two lines you need to write out side the long click. This is the main reason why its ignoring the first LongClick.