我正在尝试构建一个列表视图,当用户长按一个项目时,会显示上下文操作栏(CAB)并让用户选择多个项目。我遇到的唯一问题是第一次长按项目被忽略,只有第二次长按才会显示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();
}
}
答案 0 :(得分:3)
mLv.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
mLv.setMultiChoiceModeListener(new modeCallBack());
这两行你需要写出长按一下。这是它忽略第一个LongClick的主要原因。
答案 1 :(得分:1)
宣布
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上,您正在设置回调,而不是实际调用它。