在列表视图中忽略第一次长按

First long click is ignored in listview

我正在尝试构建一个列表视图,当用户长按某个项目时,它会显示上下文操作栏 (CAB) 并让用户 select 多个项目。我 运行 遇到的唯一问题是第一次长按某个项目会被忽略,只有从第二次长按开始才会显示 CAB。

我的代码:

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

我的 MultiChoiceListener 实现:

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();
        }
}

声明一个

private modeCallback   mModeCallback = new modeCallback();

然后

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(mModeCallBack);
        return true;
    }
});

原因是在第一次 LongClick 时,您设置了回调,而不是实际调用它。

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

这两行你需要写在长按旁边。这是它忽略第一个LongClick的主要原因。