1

削除のコンテキストアクションを使用して、複数選択リストビューでチェックされたアイテムを削除する方法-

ArrayList<String> liveNames = new ArrayList<String>() {
        {
            add("dani");
            add("john");
            add("dave");
            add("alen");
            add("deno");
            add("feliks");
            add("jupi");

        }
    };

adapter = new ArrayAdapter(this、android.R.layout.simple_list_item_multiple_choice、liveNames);

    setListAdapter(adapter);

.....。

 @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            lv = getListView();
            // Respond to clicks on the actions in the CAB
            switch (item.getItemId()) {
                case R.id.item1:
                    if(lv.getCheckedItemCount() > 0){
                        removeItems = lv.getCheckedItemIds();
                        deleteSelectedItems(removeItems);
                    }
                    mode.finish(); // Action picked, so close the CAB
                    return true;

                default:
                    return false;
            }
        }

ここで、deleteSelectedItems(long [] delItms)メソッドに実装して、ListViewから選択したアイテムIDを「names」ArrayList内で削除するにはどうすればよいですか。ヒントをお願いします

アダプターリストを次のように更新できることを知っています

adapter.notifyDataSetChanged();

しかし、リストビュー内のアイテムの位置をIDとともに取得して、

name.remove(position) - but I have only the IDs.

ありがとう

4

2 に答える 2

3

この方法はあなたのためにトリックをするはずです、私は推測します:

/* returns item's position in ArrayList by ID */
public int getItemPositionById(int id)
{
   for(int i = 0; i < names.size(); i++) {
      if(names.get(i).getId() == id) {
         return i;   // if found item with specified id, return it's position
      }
   }
   return -1;        // didn't find item with specified id
}

持っているすべてのIDに対してそれを呼び出し、それらの位置をどこかに保存します。次に、それらの位置にあるすべてのアイテムを削除できます。

于 2013-02-09T20:40:07.217 に答える
1

とにかく、このメソッドでチェックされたIDを取得できませんでした

removeItems = lv.getCheckedItemIds(); 

アダプターには安定したIDが必要なため...またはそのようなもの

なのでチェックしたアイテムの位置を検索してみました

SparseBooleanArray checkedItemPositions = getListView().getCheckedItemPositions();

次に、それらを削除して、arraylistとアダプターを更新します

    public void removeSelectedItems(){
    int count = lv.getCount();
    SparseBooleanArray checkedItemPositions = getListView().getCheckedItemPositions();
    for (int i=0;i<count;i++){
        if(checkedItemPositions.get(i))


        Log.e("TEST", liveNames.get(i));
        liveNames.remove(i);
    }

    adapter.notifyDataSetChanged();
}

問題は、1つの要素を削除するたびに要素インデックスを動的に変更するliveNames ArrayListを使用しているため、最終結果が正しくないことです。

これは、このタイプの問題についての議論のリンクですが、解決策はありません- マルチセレクトリストビューから選択されたアイテムを取得する方法

問題を解決する方法:

  1. 2番目のArrayListインスタンスを作成しました
  2. そのArrayListインスタンスをUNCHECKEDアイテムで更新しました
  3. それを私のlistadapterに追加しました-これがメソッドです

    public void removeSelectedItems(){
    
    updatedList = new ArrayList<String>(); //initialize the second ArrayList
    
    int count = lv.getCount();  //number of my ListView items
    SparseBooleanArray checkedItemPositions = getListView().getCheckedItemPositions();
    for (int i=0;i < count;i++){
        if(!checkedItemPositions.get(i))
    
        updatedList.add(liveNames.get(i));  
        Log.e("TEST", liveNames.get(i));
    }
    
    adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_multiple_choice, updatedList);
    
    setListAdapter(adapter);}
    

お役に立てば幸いです:)

于 2013-02-10T11:32:58.850 に答える