2014-02-06 40 views
0

到目前爲止,這是我已經試過:的Android刪除所選項目的ListView使用文本菜單動作條

private String[] data = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine","Ten"}; 

private SelectionAdapter mAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mAdapter = new SelectionAdapter(this, 
       R.layout.row_list_item, R.id.textView1, data); 
    setListAdapter(mAdapter); 
    getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 

    getListView().setMultiChoiceModeListener(new MultiChoiceModeListener() { 

     private int nr = 0; 

     @Override 
     public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
      // TODO Auto-generated method stub 
      return false; 
     } 

     @Override 
     public void onDestroyActionMode(ActionMode mode) { 
      // TODO Auto-generated method stub 
      mAdapter.clearSelection(); 
     } 

     @Override 
     public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
      // TODO Auto-generated method stub 

      nr = 0; 
      MenuInflater inflater = getMenuInflater(); 
      inflater.inflate(R.menu.contextual_menu, menu); 
      return true; 
     } 

     @Override 
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
      // TODO Auto-generated method stub 
      switch (item.getItemId()) { 

       case R.id.item_delete: 
        nr = 0; 
        mAdapter.clearSelection(); 
        // TODO app mAdapter.removeSelection(position); 
        mode.finish(); 
      } 
      return true; 
     } 

     @Override 
     public void onItemCheckedStateChanged(ActionMode mode, int position, 
       long id, boolean checked) { 
      // TODO Auto-generated method stub 
      if (checked) { 
        nr++; 
        mAdapter.setNewSelection(position, checked);     
       } else { 
        nr--; 
        mAdapter.removeSelection(position);     
       } 
       mode.setTitle(nr + " selected"); 

     } 
    }); 

    getListView().setOnItemLongClickListener(new OnItemLongClickListener() { 

     @Override 
     public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
       int position, long arg3) { 
      // TODO Auto-generated method stub 

      getListView().setItemChecked(position, !mAdapter.isPositionChecked(position)); 
      return false; 
     } 
    }); 
} 

private class SelectionAdapter extends ArrayAdapter<String> { 

    private HashMap<Integer, Boolean> mSelection = new HashMap<Integer, Boolean>(); 

    public SelectionAdapter(Context context, int resource, 
      int textViewResourceId, String[] objects) { 
     super(context, resource, textViewResourceId, objects); 
    } 

    public void setNewSelection(int position, boolean value) { 
     mSelection.put(position, value); 
     notifyDataSetChanged(); 
    } 

    public boolean isPositionChecked(int position) { 
     Boolean result = mSelection.get(position); 
     return result == null ? false : result; 
    } 

    public Set<Integer> getCurrentCheckedPosition() { 
     return mSelection.keySet(); 
    } 

    public void removeSelection(int position) { 
     mSelection.remove(position); 
     notifyDataSetChanged(); 
    } 

    public void clearSelection() { 
     mSelection = new HashMap<Integer, Boolean>(); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = super.getView(position, convertView, parent);//let the adapter handle setting up the row views 
     v.setBackgroundColor(getResources().getColor(android.R.color.background_light)); //default color 

     if (mSelection.get(position) != null) { 
      v.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_light));// this is a selected position so make it red 
     } 
     return v; 
    } 
} 

但我需要知道如何讓所選擇的項目,將其放在OnActionItemClicked像什麼我已經試過這裏:

@Override 
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
      // TODO Auto-generated method stub 
      switch (item.getItemId()) { 

       case R.id.item_delete: 
        nr = 0; 
        mAdapter.clearSelection(); 
        // TODO app mAdapter.removeSelection(position); 
        mode.finish(); 
      } 
      return true; 
     } 

我註釋掉了mAdapter.removeSelection(),因爲我不知道在裏面放什麼東西。

任何想法?非常感謝幫助。謝謝。

回答

0

他們是多事情可以做。我想最簡單的方法如下:

它不工作,因爲onActionItemClicked預計一個項目。但是你選擇了多個項目。 最簡單的方法是建立在你處理正常程序onActionItemClicked預計

ListView mListView = getListView(); 

@Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     // TODO Auto-generated method stub 
     switch (item.getItemId()) { 

      case R.id.item_delete: 
       nr = 0; 

       Long[] longConverts = new Long(mListView.getCheckedItemIds()); 
       private List<Long> itemids = new ArrayList<Long>(Arrays.asList(longConverts)); 

       for(int i=0;i<itemids.size();i++){ 
        mListView.remove(itemids.get(i)); 
        mAdapter.clearSelection(); 
        // TODO app mAdapter.removeSelection(position); 
        mode.finish(); 
     } 
     return true; 
    } 

我想這應該工作循環。它首先從ListView檢索所選的項目,然後把它們放在一個陣列,並在循環通過該陣列一個一個刪除項目..

我希望這適用於你

+0

讓我試試這一個哥們。 – Dunkey

+0

你好,我在列表中收到錯誤 Dunkey

+0

你能發佈錯誤嗎? – Crimson