在列表视图中忽略第一次长按
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的主要原因。
我正在尝试构建一个列表视图,当用户长按某个项目时,它会显示上下文操作栏 (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的主要原因。