2012-10-17 74 views
3

所以我現在的問題是,現在我很長時間點擊ListView中的一個項目,它會彈出一個上下文操作欄。傳入onItemLongClick的id是我想在ActionItemClicked()方法的mActionModeCallback中使用的變量。這似乎是一個相當普遍的過程,因爲如果用戶正在編輯項目列表,那麼當用戶單擊「編輯」或「刪除」操作時,您會希望以某種方式訪問​​數據庫中該行的標識。將ListView項目的id傳遞給ActionMode.Callback對象

listView.setOnItemLongClickListener(new OnItemLongClickListener() { 
    public boolean onItemLongClick(AdapterView<?> p, View view, int pos, long id) { 

     //The id of the row in the database 
     long variableThatIWantToPassToCallback = id; 
     mActionMode = getActivity().startActionMode(mActionModeCallback); 
     view.setSelected(true); 
     return true; 
    } 
}); 

private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { 

    public boolean onCreateActionMode(ActionMode mode, Menu menu) {} 

    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {} 

    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     //I would like access to the id of the clicked item here, NOT item.getItemId() 
    } 

    public void onDestroyActionMode(ActionMode mode) {} 
}; 
+0

你不能在'ActionMode.Callback'中訪問'ListView'的適配器嗎?從那裏你可以得到檢查的項目(方便地由你存儲),或者如果你使用SDK行佈局,你可以使用對ListView的引用並使用getCheckedItemsIds。 – Luksprog

回答

8

正確的方式做,這是調用mActionMode.setTag("1")onItemCheckedStateChanged然後從onActionItemClicked函數調用mode.getTag();

1

通過擴展接口ActionMode.Callback

private interface ActionCallback extends ActionMode.Callback { 
     public void setClickedView(View view); 
} 

private ActionCallback mActionModeCallback = new ActionCallback() { 

     public View mClickedView; 

     public void setClickedView(View view) { 
      mClickedView = view; 
     } 

     // Called when the action mode is created; startActionMode() was called 
     @Override 
     public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
      // Inflate a menu resource providing context menu items 
      MenuInflater inflater = mode.getMenuInflater(); 
      inflater.inflate(R.menu.context_menu, menu); 
      return true; 
     } 

     // Called each time the action mode is shown. Always called after onCreateActionMode, but 
     // may be called multiple times if the mode is invalidated. 
     @Override 
     public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
      return false; // Return false if nothing is done 
     } 

     // Called when the user selects a contextual menu item 
     @Override 
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.menu_delete: 
        Log.v(TAG, "#onActionItemClicked ready to delete the item with id: " + mClickedView.getTag()); 
        mode.finish();  // Action picked, so close the CAB 
        return true; 
       default: 
        return false; 
      } // end switch 
     } 

     // Called when the user exits the action mode 
     @Override 
     public void onDestroyActionMode(ActionMode mode) { 
      mActionMode = null; 
     } 
}; 

對於一個視圖中創建您自己的回調其中附有OnLongClickListener,用這種方式覆蓋onLongClick回調。

     @Override 
       // Called when the user long-clicks on someView 
       public boolean onLongClick(View view) { 
        // proceed only when actionmode is not null 
        // otherwise overlapping action modes will be 
        // displayed 
        if(mActionMode != null) { 
         return false; 
        } 

        mActionModeCallback.setClickedView(view); 
        // Start the CAB using the ActionMode.Callback defined above 
        mActionMode = startActionMode(mActionModeCallback); 
        view.setSelected(true); 
        return true; 
       } 
+0

爲什麼在'onDestroyActionMode'中設置'mode = null'? – Muddz