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

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

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

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

Android Studio

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

解決済

Android Studio:RecyclerViewの更新(notify)について

sato_shoma
s.s

総合スコア12

Java

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

Android Studio

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

1回答

0評価

0クリップ

710閲覧

投稿2022/03/09 06:00

編集2022/03/21 05:53

前提・実現したいこと

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

import android.database.Cursor; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.floatingactionbutton.FloatingActionButton; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private DatabaseHelper _helper; private RecyclerViewAdapter adapter; private int listSize; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //DatabaseHelperの生成処理。 _helper = new DatabaseHelper(MainActivity.this); //RecyclerViewの設定。 RecyclerView rvNote = findViewById(R.id.rvNote); rvNote.setLayoutManager(new LinearLayoutManager(MainActivity.this)); ArrayList<String> title = new ArrayList<>(); ArrayList<String> text = new ArrayList<>(); Cursor cursor = _helper.readData(); while (cursor.moveToNext()) { title.add(cursor.getString(1)); text.add(cursor.getString(2)); } adapter = new RecyclerViewAdapter(title, text); rvNote.setAdapter(adapter); //fabAddを押したときの処理。 FloatingActionButton fabAdd = findViewById(R.id.fabAdd); fabAdd.setOnClickListener(view -> { CreatesNotesDialogFragment fragment = new CreatesNotesDialogFragment(); fragment.show(getSupportFragmentManager(),"CreatesNotesDialogFragment"); }); } @Override protected void onDestroy() { _helper.close(); super.onDestroy(); } //エラー文に記載されている箇所。 public void notifyAboutRecyclerView(){ adapter.notifyItemInserted(listSize); } //RecyclerViewのアダプタ。 public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerListViewHolder> { private final ArrayList<String> title; private final ArrayList<String> text; public RecyclerViewAdapter(ArrayList<String> title, ArrayList<String> text) { this.title = title; this.text = text; } @NonNull @Override public RecyclerListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(MainActivity.this); View view = inflater.inflate(R.layout.note_list_layout, parent, false); return new RecyclerListViewHolder(view); } @Override public void onBindViewHolder(RecyclerListViewHolder holder, int position) { holder._tvNoteTitle.setText(String.valueOf(title.get(position))); holder._tvNoteText.setText(String.valueOf(text.get(position))); } @Override public int getItemCount() { listSize = text.size(); return listSize; } public class RecyclerListViewHolder extends RecyclerView.ViewHolder { public TextView _tvNoteTitle; public TextView _tvNoteText; public RecyclerListViewHolder(View itemView) { super(itemView); _tvNoteTitle = itemView.findViewById(R.id.tvNoteTitle); _tvNoteText = itemView.findViewById(R.id.tvNoteText); } } } }

CreatesNotesDialogFragment.java

import android.app.AlertDialog; //エラー文に記載されている箇所。 import android.app.Dialog; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; import androidx.annotation.NonNull; import androidx.fragment.app.DialogFragment; public class CreatesNotesDialogFragment extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstance) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = requireActivity().getLayoutInflater(); View customView = inflater.inflate(R.layout.dialog_layout, null); builder.setView(customView) .setPositiveButton(R.string.btn_keep, (dialogInterface, i) -> { EditText etNoteTitle = customView.findViewById(R.id.etSetNoteTitle); String noteTitle = etNoteTitle.getText().toString(); EditText etNoteText = customView.findViewById(R.id.etSetNoteText); String noteText = etNoteText.getText().toString(); new DatabaseHelper(getContext()).addData(noteTitle, noteText); //エラー文に記載されている箇所。 new MainActivity().notifyAboutRecyclerView(); }) .setNegativeButton(R.string.btn_cxl, (dialogInterface, i) -> { }); return builder.create(); } }

試したこと

原因が全く分からないため特にありません。インターネットでいろいろ調べてみましたが思うような答えが得られなかったので質問しました。

補足情報

使用ツールの環境
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)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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

Android Studio

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