1

長いクリック選択で ListView 項目のテキストにアクセスする必要があります。古いAndroidバージョンの場合、以下のコードを使用してコンテキストメニューでこれを正常に実行しました.

@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...
    });

Contextual Action Bar は問題なく表示されますが、そこからアイテムを選択すると、AdapterContextMenuInfo 行で NullPointerException が発生します。これは、明らかにアクション バーではなくコンテキスト メニュー用に作成されたものだからです。おそらくアクションバーにこれに相当するものはありますか? または、この場合、ListView アイテムのテキストを取得するにはどうすればよいですか? ありがとう。

4

2 に答える 2

11

getCheckedItemPositions()onListViewは、ユーザーがチェックしたアイテムの位置を返し、のgetCheckedItemIds()ようなものを使用している場合は ID 値を返しますCursorAdapter

これは、API レベル 11+での の使用とCHOICE_MODE_MULTIPLE_MODAL、古いデバイスでのコンテキスト メニューへのフォールバックを示すサンプル プロジェクトです。

于 2012-03-22T23:22:11.970 に答える
1

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

ArrayList選択したすべてのアイテムの ID を格納するを作成しました。アイテムがチェックされるたびに、onItemCheckedStateChanged(..)メソッドが呼び出されます。このメソッドを使用ArrayListして、状態の変化に基づいて ID を更新できます。次に、ユーザーがオプションを選択して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();
                        }
                    }
                }
            }
        });
于 2012-05-04T07:04:28.903 に答える