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

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

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

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

Android Studio

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

Q&A

解決済

1回答

1007閲覧

遷移先から戻ってきたらListViewを更新したい

Nooki

総合スコア20

Java

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

Android Studio

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

0グッド

0クリップ

投稿2022/09/10 17:55

編集2022/09/12 23:17

前提

android studioを使って下記のようなメモアプリを作成しています。
■メイン画面:
ListViewでメモの一覧を表示する画面(activity_main.xml)メモ追加ボタンをクリックするとメモ追加画面に遷移します。
■メモ追加画面:
メモのタイトルと内容を入力し、保存ボタンを押すとMySQLにメモデータ(メモタイトル、内容、更新日時)が保存されます。
戻るボタンをクリックするとメイン画面に遷移します。
遷移後メイン画面に追加したメモを表示します。
■言語
Java

実現したいこと

メモ追加画面でメモデータを追加し、メイン画面に戻ったら追加したメモデータをListViewに表示したい。

発生している問題・エラーメッセージ

メモ追加画面でデータベースにメモ情報を追加し、runを実行するとことでメイン画面に追加したメモを表示するところまでできたのですが、メモ追加画面からメイン画面に遷移した際に追加したメモデータをListViewに表示させることができません。
(メモデータを追加する前のままで行が増えません。)
該当のソースコードにある※1のrefreshItemList()メソッドをclass MainActivityから呼び出しデータベースから取得したメモデータを更新しようとしましたが、refreshItemList()呼び出しで「シンボルが見つかりません。」が発生し呼び出せません。

教えていただきたいこと

メモ追加画面からメイン画面に遷移した際、ListViewに最新のメモデータを表示する(ListViewの更新)方法を教えてください。

該当のソースコード

ListViewAdapter.java

1package com.example.memoapp_android; 2 3import android.content.Context; 4import android.util.Log; 5import android.view.LayoutInflater; 6import android.view.View; 7import android.view.ViewGroup; 8import android.widget.BaseAdapter; 9import android.widget.TextView; 10 11import java.util.List; 12 13public class ListViewAdapter extends BaseAdapter { 14 15 static class ViewHolder { 16 TextView titleView; 17 TextView timeStampView; 18 } 19 20 public List<Item> itemList; 21 private final LayoutInflater inflater; 22 private final int itemLayoutId; 23 24 ListViewAdapter(Context context, int itemLayoutId, List<Item> itemList) { 25 super(); 26 this.inflater = 27 (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 28 this.itemLayoutId = itemLayoutId; 29 this.itemList = itemList; 30 } 31 32 //※1 33 public void refreshItemList(Context context) { 34 this.itemList.clear(); 35 TestOpenHelper helper = new TestOpenHelper(context); 36 // createMemoDataList()は別クラスで実装しているデータベースからメモデータを取得するメソッドです。 37 // 下記でインスタンスで保持しているメモデータを更新しています。 38 this.itemList = helper.createMemoDataList(); 39 } 40 41 @Override 42 //一行ずつmemoの情報を紐づけていきます 43 public View getView(int position, View convertView, ViewGroup parent) { 44 Log.d("mydebug","****getView1 position***"+position); 45 Item item = itemList.get(position); 46 ViewHolder holder; 47 // 最初だけ View を inflate して、それを再利用する 48 if (convertView == null) { 49 // activity_main.xml に list.xml を inflate して convertView とする 50 convertView = inflater.inflate(itemLayoutId, parent, false); 51 // ViewHolder を生成 52 holder = new ViewHolder(); 53 holder.titleView = convertView.findViewById(R.id.titleView); 54 holder.timeStampView = convertView.findViewById(R.id.timeStampView); 55 convertView.setTag(holder); 56 } 57 // holder を使って再利用 58 else { 59 holder = (ViewHolder) convertView.getTag(); 60 } 61 62 // holder の titleView にセットするとList ViewのtitleViewに値が入る 63 holder.titleView.setText(item.getItemTitle()); 64 // 現在の position にあるmemoのタイトルリストを holder の textView にセット 65 holder.timeStampView.setText(item.getItemTimeStamp()); 66 67 return convertView; 68 } 69 70 @Override 71 //リストに表示するデータの個数です 72 public int getCount() { 73 return itemList.size(); 74 } 75 76 @Override 77 //引数で指定された位置にある定食の情報を返します 78 public Object getItem(int position) { 79 return itemList.get(position); 80 } 81 82 @Override 83 //引数で指定された位置にあるListVewの_id(データベースのid)を返します 84 public long getItemId(int position) { 85 return itemList.get(position).getItemId(); 86 } 87}

MainAcivity.java

1package com.example.memoapp_android; 2 3import androidx.appcompat.app.AppCompatActivity; 4import androidx.appcompat.app.AlertDialog; 5 6import android.content.Intent; 7import android.database.sqlite.SQLiteDatabase; 8import android.os.Bundle; 9import android.util.Log; 10import android.view.View; 11import android.widget.AdapterView; 12import android.widget.BaseAdapter; 13import android.widget.ListView; 14 15import com.google.android.material.floatingactionbutton.FloatingActionButton; 16 17import java.util.List; 18 19public class MainActivity extends AppCompatActivity 20 implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener { 21 22 private TestOpenHelper helper; 23 private SQLiteDatabase db; 24 private BaseAdapter adapter; 25 26 // 要素の削除、順番変更のためArrayListを定義 27 private List<String> itemNames; 28 private List<String> itemTimeStamps; 29 30 // タップされたitemの位置 31 private int tappedPosition = 0; 32 33 List<Item> memoDataList; 34 35 @Override 36 protected void onCreate(Bundle savedInstanceState) { 37 super.onCreate(savedInstanceState); 38 setContentView(R.layout.activity_main); 39 40 if (helper == null) { 41 helper = new TestOpenHelper(getApplicationContext()); 42 } 43 44 memoDataList = helper.createMemoDataList(); 45 46 // ListViewのインスタンスを生成 47 ListView listView = findViewById(R.id.list_view); 48 49 // BaseAdapter を継承したadapterのインスタンスを生成 50 // レイアウトファイル list.xml を activity_main.xml に inflate するためにadapterに引数として渡す 51 adapter = new ListViewAdapter(this.getApplicationContext(), R.layout.list, memoDataList); 52 53 View header = (View)getLayoutInflater().inflate(R.layout.header,null); 54 listView.addHeaderView(header); 55 56 // ListViewにadapterをセット 57 listView.setAdapter(adapter); 58 59 // 下記をセットするとヘッダーをクリックしても反応しなくなる。 60// header.setFocusable(true); 61 62 //イベントを拾えるようにListenerをlistViewに登録する。 63 // クラス定義でimplementsしているため、引数がthisでOK。implementsしていない場合、thisを引数の型へキャストが必要 64 listView.setOnItemClickListener(this); 65 listView.setOnItemLongClickListener(this); 66 67 // FloatingActionButton 68 FloatingActionButton fab = findViewById(R.id.add_fab); 69 // implementsしない場合はonCreate()内にListenerを実装する。 70 fab.setOnClickListener(new View.OnClickListener() { 71 @Override 72 public void onClick(View view) { 73// 遷移先の画面はAndroidManifest.xmlに記載が必要 74 Intent intent = new Intent(getApplication(), AddEditMemo.class); 75 startActivity(intent); 76 } 77 }); 78 } 79 80// ~~~~~~~~~中略~~~~~~~~~ 81 82 @Override 83 // メモ追加画面からメイン画面に戻ってきた時の処理 84 protected void onRestart() { 85 super.onRestart(); 86 // ※1下記のメソッドが「シンボルが見つかりません。」になる。(呼び出せない) 87// adapter.refreshItemList(getApplicationContext()); 88 adapter.notifyDataSetChanged(); 89 } 90}

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

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

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

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

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

guest

回答1

0

ベストアンサー

該当のソースコードにある※1のrefreshItemList()メソッドをclass MainActivityから呼び出しデータベースから取得したメモデータを更新しようとしましたが、refreshItemList()呼び出しで「シンボルが見つかりません。」が発生し呼び出せません。

となるのは、 adapter が BaseAdapter だからです。変数の型が持っているメソッドしか使えません。
refreshItemList メソッドがあるのは BaseAdapter では無くお作りになられた ListViewAdapter なのですから、 adapter の型を ListViewAdapter にしなければなりません。
ついでに、 refreshItemList の直後に notifyDataSetChanged を実行していますが、このメソッドは refreshItemList 内で呼ぶべきものでしょう。

さらに言えば、 onRestart で再読み込みというのは少々乱暴な気がします。
追加の画面が startActivity で実行しているAddEditActivity であれば、startActivityForResult に変え(て onActivityResult メソッドを実装す)ることで AddEditActivity の終了を感知出来ますので、感知したらリストを更新すれば最小限の動作になるのではないでしょうか。
(最近 startActivityForResult は Activity Result API に置き換えられましたけど。→アクティビティの結果を取得する)

投稿2022/09/10 18:22

編集2022/09/10 18:37
jimbe

総合スコア12545

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

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

Nooki

2022/09/11 14:04

ご回答いただきありがとうございます。おかげさまでやりたいことを実現できました。 adapterの型が親の型になっていることを気が付きませんでした。 また、Activity Result APIについても参考になりました。 下記の様に実装しました。 ```MainActivity.java ActivityResultLauncher<Intent> resultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { if (result.getResultCode() == AddEditMemo.RESULT_OK) { adapter.refreshItemList(getApplicationContext()); } } }); // FloatingActionButton FloatingActionButton fab = findViewById(R.id.add_fab); // implementsしない場合はonCreate()内にListenerを実装する。 // TBD:「v ->」はどんな意味? fab.setOnClickListener(v -> { Intent intent = new Intent(getApplication(), AddEditMemo.class); resultLauncher.launch(intent); }); ``` ```AddEditMemo.java returnButton.setOnClickListener(v -> { setResult(RESULT_OK, null); finish(); }); ```
jimbe

2022/09/11 16:13 編集

コメント欄ではマークダウン記法は使えません。ある程度の大きさ以上のコード類は質問を編集して追加した方が良いでしょう。 >「v ->」はどんな意味? (後続の記述も含めて)ラムダ式です。 【初心者向け】今更聞けない?Java8のラムダ式について知ろう! https://www.casleyconsulting.co.jp/blog/engineer/114/
Nooki

2022/09/12 14:17

更なる回答ありがとうございました。 それと、コード類は質問を編集して追加するようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問