前提・実現したいこと
Android StudioでJavaを使ってメモ帳アプリを作っています。メモのデータをSQLiteで保存し、それをRecyclerViewを使って表示する仕様です。メモデータを追加したときにRecyclerViewを更新する必要があるのですが、そこでエラーが出てしまいます。
具体的に言うと、ダイアログの保存ボタンを押したときの処理(.setPositiveButton/onCreateDialog/CreatesNotesDialogFragment.javaの第二引数内)でMainActivity.javaのnotifyAboutrecyclerViewメソッドを呼び出し、そのメソッド中でnotifyItemInsertedを使って更新処理をしています。notifiItemInsertedメソッドを実行しているadapterがnullになっているのがエラーの原因だと思うのですが、MainActivityのonCreate内でadapterインスタンスの生成を行っているのでなぜnullなのか良く分かりません。もしわかる方がいらっしゃれば、ご教授いただければ幸いです。
エラーメッセージ(コメントに該当箇所を記載しておきます)
E/AndroidRuntime: FATAL EXCEPTION: main Process: jp.halo_sf.haloint, PID: 18663 java.lang.NullPointerException: Attempt to invoke virtual method 'void jp.halo_sf.haloint.MainActivity$RecyclerViewAdapter.notifyItemInserted(int)' on a null object reference at jp.halo_sf.haloint.MainActivity.notifyAboutRecyclerView(MainActivity.java:61) //public class MainActivity extends AppCompatActivity { public void notifyAboutRecyclerView(){ adapter.notifyItemInserted(listSize); } } のところです。 at jp.halo_sf.haloint.CreatesNotesDialogFragment.lambda$onCreateDialog$0$jp-halo_sf-haloint-CreatesNotesDialogFragment(CreatesNotesDialogFragment.java:28) //public class CreatesNotesDialogFragment extends DialogFragment { public Dialog onCreateDialog(Bundle savedInstance) { builder.setPositiveButton(R.string.btn_keep, (dialogInterface, i) -> { new MainActivity().notifyAboutRecyclerView(); }) } } のところです。 at jp.halo_sf.haloint.CreatesNotesDialogFragment$$ExternalSyntheticLambda0.onClick(Unknown Source:4) //CreateNotesDialogFragment の import android.app.Dialog; のところです。 at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:174) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:8240) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:979)
該当のソースコード
MainActivity.java
1import android.database.Cursor; 2import android.os.Bundle; 3import android.view.LayoutInflater; 4import android.view.View; 5import android.view.ViewGroup; 6import android.widget.TextView; 7 8import androidx.annotation.NonNull; 9import androidx.appcompat.app.AppCompatActivity; 10import androidx.recyclerview.widget.LinearLayoutManager; 11import androidx.recyclerview.widget.RecyclerView; 12 13import com.google.android.material.floatingactionbutton.FloatingActionButton; 14 15import java.util.ArrayList; 16 17public class MainActivity extends AppCompatActivity { 18 private DatabaseHelper _helper; 19 private RecyclerViewAdapter adapter; 20 private int listSize; 21 22 @Override 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.activity_main); 26 27 //DatabaseHelperの生成処理。 28 _helper = new DatabaseHelper(MainActivity.this); 29 30 //RecyclerViewの設定。 31 RecyclerView rvNote = findViewById(R.id.rvNote); 32 rvNote.setLayoutManager(new LinearLayoutManager(MainActivity.this)); 33 ArrayList<String> title = new ArrayList<>(); 34 ArrayList<String> text = new ArrayList<>(); 35 Cursor cursor = _helper.readData(); 36 while (cursor.moveToNext()) { 37 title.add(cursor.getString(1)); 38 text.add(cursor.getString(2)); 39 } 40 adapter = new RecyclerViewAdapter(title, text); 41 rvNote.setAdapter(adapter); 42 43 //fabAddを押したときの処理。 44 FloatingActionButton fabAdd = findViewById(R.id.fabAdd); 45 fabAdd.setOnClickListener(view -> { 46 CreatesNotesDialogFragment fragment = new CreatesNotesDialogFragment(); 47 fragment.show(getSupportFragmentManager(),"CreatesNotesDialogFragment"); 48 }); 49 } 50 51 @Override 52 protected void onDestroy() { 53 _helper.close(); 54 super.onDestroy(); 55 } 56 57//エラー文に記載されている箇所。 58 public void notifyAboutRecyclerView(){ 59 adapter.notifyItemInserted(listSize); 60 } 61 62 //RecyclerViewのアダプタ。 63 public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerListViewHolder> { 64 private final ArrayList<String> title; 65 private final ArrayList<String> text; 66 67 public RecyclerViewAdapter(ArrayList<String> title, ArrayList<String> text) { 68 this.title = title; 69 this.text = text; 70 } 71 72 @NonNull 73 @Override 74 public RecyclerListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 75 LayoutInflater inflater = LayoutInflater.from(MainActivity.this); 76 View view = inflater.inflate(R.layout.note_list_layout, parent, false); 77 return new RecyclerListViewHolder(view); 78 } 79 80 @Override 81 public void onBindViewHolder(RecyclerListViewHolder holder, int position) { 82 holder._tvNoteTitle.setText(String.valueOf(title.get(position))); 83 holder._tvNoteText.setText(String.valueOf(text.get(position))); 84 } 85 86 @Override 87 public int getItemCount() { 88 listSize = text.size(); 89 return listSize; 90 } 91 92 public class RecyclerListViewHolder extends RecyclerView.ViewHolder { 93 public TextView _tvNoteTitle; 94 public TextView _tvNoteText; 95 96 public RecyclerListViewHolder(View itemView) { 97 super(itemView); 98 _tvNoteTitle = itemView.findViewById(R.id.tvNoteTitle); 99 _tvNoteText = itemView.findViewById(R.id.tvNoteText); 100 } 101 } 102 } 103}
CreatesNotesDialogFragment.java
1import android.app.AlertDialog; 2//エラー文に記載されている箇所。 3import android.app.Dialog; 4import android.os.Bundle; 5import android.view.LayoutInflater; 6import android.view.View; 7import android.widget.EditText; 8 9import androidx.annotation.NonNull; 10import androidx.fragment.app.DialogFragment; 11 12public class CreatesNotesDialogFragment extends DialogFragment { 13 14 @NonNull 15 @Override 16 public Dialog onCreateDialog(Bundle savedInstance) { 17 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 18 LayoutInflater inflater = requireActivity().getLayoutInflater(); 19 View customView = inflater.inflate(R.layout.dialog_layout, null); 20 builder.setView(customView) 21 .setPositiveButton(R.string.btn_keep, (dialogInterface, i) -> { 22 EditText etNoteTitle = customView.findViewById(R.id.etSetNoteTitle); 23 String noteTitle = etNoteTitle.getText().toString(); 24 EditText etNoteText = customView.findViewById(R.id.etSetNoteText); 25 String noteText = etNoteText.getText().toString(); 26 new DatabaseHelper(getContext()).addData(noteTitle, noteText); 27//エラー文に記載されている箇所。 28 new MainActivity().notifyAboutRecyclerView(); 29 }) 30 .setNegativeButton(R.string.btn_cxl, (dialogInterface, i) -> { 31 }); 32 return builder.create(); 33 } 34}
試したこと
原因が全く分からないため特にありません。インターネットでいろいろ調べてみましたが思うような答えが得られなかったので質問しました。
補足情報
使用ツールの環境
Android Studio Bumblebee | 2021.1.1 Patch 2
Build #AI-211.7628.21.2111.8193401, built on February 17, 2022
ランタイム・バージョン: 11.0.11+9-b60-7590822 amd64
VM: OpenJDK 64-Bit Server VM by Oracle Corporation
Windows 10 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 1280M
Cores: 8
Registry: external.system.auto.import.disabled=true
Non-Bundled Plugins: dev.polek.adbwifi (1.2.4), org.jetbrains.kotlin (211-1.6.10-release-923-AS7442.40)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/09 07:27 編集
2022/03/09 07:43
2022/03/09 07:58 編集
2022/03/09 08:06 編集
2022/03/09 09:55 編集
2022/03/09 08:27 編集
2022/03/09 09:48
2022/03/09 10:00
2022/03/09 10:34 編集
2022/03/09 11:26
2022/03/09 12:01