2016-04-18 26 views
0

我試圖建立一個列表視圖,當用戶長時間點擊一個項目時,顯示上下文操作欄(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(); 
     } 
} 

回答

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

這兩行你需要寫出來長按一下。這是其忽略第一個LongClick的主要原因。

+0

這樣做,謝謝。 – Anubis

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中,您正在設置回調,而不是實際調用回調。