質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

0回答

625閲覧

コンテキストアクションモードでリストのアイテムを複数削除したい

kashikoma

総合スコア8

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/11/25 11:47

RecyclerViewのアイテムを複数選択してから削除できるようにしたいです。
データベースはRealmを使っています。
イメージ説明
通常の画面で、茶色いバーにあるボタンをクリックするとコンテキストアクションバーが表示されるところまではできています。
この後、リスト内のアイテムを1つまたは複数選び、黒いゴミ箱マークをクリックして削除できるようにするつもりです。

今起きてる問題は
・アイテムをタップしても選択できない(見た目的に何も変わらず選択できている様子がない)
・黒いゴミ箱マーク押すとアプリが落ちてしまう
→onActionItemClicked内の下記の部分が悪いと思うけど解決法がわからない
TextView taskId = viewHolder.itemView.findViewById(R.id.taskId);

ご回答よろしくお願いします。

public class TaskListFragment extends Fragment { private RecyclerView mRecyclerView; private TaskAdapter adapter; private Realm realm; private ImageButton dlt; private ActionMode.Callback actionModeCallback; public RecyclerView.ViewHolder viewHolder; private ActionMode actionMode; private ConstraintLayout tlb; @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.fragment_task_list, container, false); /** * 削除モード */ tlb = view.findViewById(R.id.toolbarTaskList); actionModeCallback = new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { tlb.setVisibility(View.GONE); MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); return true; } public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.delete_task: TextView taskId = viewHolder.itemView.findViewById(R.id.taskId); final String id = taskId.getText().toString(); realm.executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm bgRealm) { Task obj = bgRealm.where(Task.class).equalTo("id", id).findFirst(); obj.deleteFromRealm(); } }, new Realm.Transaction.OnSuccess() { @Override public void onSuccess() { adapter.notifyDataSetChanged(); // アダプター再描画 Toast.makeText(getContext(), "選択したタスクを削除しました", Toast.LENGTH_SHORT).show(); } }, new Realm.Transaction.OnError() { @Override public void onError(Throwable error) { adapter.notifyDataSetChanged(); // アダプター再描画 Toast.makeText(getContext(), "タスクの削除に失敗しました", Toast.LENGTH_SHORT).show(); } }); mode.finish(); return true; default: return false; } } @Override public void onDestroyActionMode(ActionMode mode) { actionMode = null; tlb.setVisibility(View.VISIBLE); } }; dlt = view.findViewById(R.id.deleteTask); //ツールバーの削除ボタン dlt.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { if (actionMode != null) {} actionMode = getActivity().startActionMode(actionModeCallback); } }); /** * 削除モード 終 */ realm = Realm.getDefaultInstance(); final RealmResults<Task> result = realm.where(Task.class).findAll().sort("id", Sort.DESCENDING); adapter = new TaskAdapter(result); mRecyclerView = view.findViewById(R.id.tasklist); mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); mRecyclerView.setAdapter(adapter); mRecyclerView.setHasFixedSize(true); mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL)); return view; } @Override public void onDestroy() { super.onDestroy(); mRecyclerView.setAdapter(null); realm.close(); } }

関連コード
・TaskAdapter.java

public class TaskAdapter extends RealmRecyclerViewAdapter<Task, TaskAdapter.TaskViewHolder> { private OrderedRealmCollection<Task> tDataset; TaskAdapter(OrderedRealmCollection<Task> taskDataset) { super(taskDataset, true); this.tDataset = taskDataset; setHasStableIds(true); } @Override public TaskViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem_tasklist, parent, false); return new TaskViewHolder(view); } @Override public void onBindViewHolder(TaskViewHolder holder, final int position) { final Task obj = getItem(position); holder.name.setText(obj.getName()); holder.date.setText(obj.getDate()); holder.id.setText(obj.getId()); holder.check.setOnCheckedChangeListener(null); //リスナを削除 holder.check.setChecked(obj.getCheck()); holder.check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { //リスナを改めて登録 final Realm realm = Realm.getDefaultInstance(); final Task chk = new Task(); chk.setId(obj.getId()); if(isChecked) { chk.setCheck(true); } else { chk.setCheck(false); } realm.executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm bgRealm) { bgRealm.copyToRealmOrUpdate(chk); } }); realm.close(); } }); } @Override public int getItemCount() { return tDataset.size(); } static class TaskViewHolder extends RecyclerView.ViewHolder { TextView name; CheckBox check; TextView date; TextView id; TaskViewHolder(View view) { super(view); name = view.findViewById(R.id.taskTitle); check = view.findViewById(R.id.checkTask); date = view.findViewById(R.id.closingDate); id = view.findViewById(R.id.taskId); } } }

・listitem_tasklist.xml(リスト内のアイテム1個分のレイアウト)

<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/listitem_tasklist" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingStart="8dp" android:paddingEnd="8dp"> <CheckBox android:id="@+id/checkTask" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/taskTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/taskTitle" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toRightOf="@id/checkTask" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/taskId" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/taskId" android:textSize="12sp" app:layout_constraintLeft_toLeftOf="@id/taskTitle" app:layout_constraintTop_toBottomOf="@id/taskTitle" /> <TextView android:id="@+id/closingDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/closingDate" android:textSize="12sp" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/taskTitle" /> </android.support.constraint.ConstraintLayout>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問