1

長いクリックを選択すると、ListViewアイテムのテキストにアクセスする必要があります。古いAndroidバージョンでは、以下のコードでコンテキストメニューを使ってこれを正常に実行しました。コンテキスト・アクション・バーからListViewアイテムのテキストにアクセスする

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
           ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 

    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.context_menu, menu); 
} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
    String text = ((TextView) info.targetView).getText().toString(); 

    switch (item.getItemId()) { 
     case R.id.getText: 
      getText(text); 
      return true; 
     default: 
      return super.onContextItemSelected(item); 
    } 
} 

は、新しいAndroidのバージョンでは、しかし、私は、コンテキストアクションバーでこれを行うしたいと思いますが、バーの項目を選択した後、選択したテキストを抽出する方法を見つけ出すことはできません。以下のコードは動作しません。

myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
    myListView.setMultiChoiceModeListener(new MultiChoiceModeListener() { 

     public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
      AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
     String text = ((TextView) info.targetView).getText().toString(); 

      switch (item.getItemId()) { 
       case R.id.contextDelete: 
        getText(text); 
        return true;; 
       default: 
        return false; 
      } 
     } 

     public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
      MenuInflater inflater = mode.getMenuInflater(); 
      inflater.inflate(R.menu.context_menu, menu); 
      return true; 
     } 

     //Other actionmode methods... 
    }); 

コンテキストアクションバーは大丈夫現れ、それから項目を選択する際、これは明らかに、コンテキストメニューではなく、アクションバーのために作られたので、私は、AdapterContextMenuInfoラインでNullPointerExceptionが得られます。おそらくアクションバーのためにこれに相当するものはありますか?または、この場合ListViewアイテムテキストを取得するにはどうすればよいですか?ありがとう。 ListView

答えて

11

getCheckedItemPositions()は、ユーザーがチェックした項目の位置を返します、そしてあなたがCursorAdapterのようなものを使用している場合getCheckedItemIds()は、彼らのID値を返します。

Here is a sample project APIレベル11+でCHOICE_MODE_MULTIPLE_MODALを使用し、古いデバイスのコンテキストメニューに戻っていることを実証しています。

+0

ありがとう、サンプルプロジェクトが私を助けました!しかし別の質問ですが、アイテムが選択されたことをどのように見えるようにするのですか?私のために、すべてのアイテムは選択した後でも同じように見えます。 – mattboy

+0

@mattboy:「別の質問ですが、アイテムが選択されていることをどのように見えるようにしますか?」 - 行レイアウトで何かをやる。サンプルプロジェクトでは、右側にチェックマークがあり、アクションモードに何が影響を及ぼすのかを判断するために行をチェックしたり、チェックを外したりします。 Gmailの場合は、左側のチェックボックスを使用します。 – CommonsWare

+0

どのように各ListViewアイテムのTextViewからテキストを取得できますか? –

1

ListViewオブジェクトでgetCheckedItemIds()メソッドを使用しようとしましたが、何も返しませんでした(私はCursorオブジェクトを使用していませんでした)。これは、人々が直面している共通の問題であることがわかります。だから私はこれのための回避策を思いついた。私の状況では、通知を作成するためにアイテムIDを使用する必要がありました(サンプルコードを試してみてください)。

私はArrayListを作成して、すべてのアイテムのIDを保存しました選択されました。アイテムがチェックされるたびに、onItemCheckedStateChanged(..)メソッドが呼び出されます。この方法を使用して、状態の変更に基づいてIDのArrayListを更新することができます。ユーザーがオプションを選択してonActionItemClicked()メソッドが呼び出されると、このリストに格納されているIDを使用できます。コードは次のとおりです。

lv.setMultiChoiceModeListener(new MultiChoiceModeListener() { 
      private ArrayList<Long> checkedIds = new ArrayList<Long>(); 

        //Code omitted for brevity 

      @Override 
      public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
       menu.add(0, 1, 0, R.string.context_create_notification); 
       return true; 
      } 

      @Override 
      public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
       switch(item.getItemId()){ 
       case 1: 
        for(long id : checkedIds){ 
         createNotification(id+1); 
        } 
        mode.finish(); 
        break; 
       } 
       return true; 
      } 

      @Override 
      public void onItemCheckedStateChanged(ActionMode mode, int position, 
        long id, boolean checked) { 

       if(checked){ 
        checkedIds.add(id); 
       } else{ 
        Iterator<Long> iter = checkedIds.iterator(); 
        while(iter.hasNext()){ 
         long stored = (Long) iter.next(); 
         if(stored == id){ 
          iter.remove(); 
         } 
        } 
       } 
      } 
     }); 
関連する問題