前提
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}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/09/11 14:04
2022/09/11 16:13 編集
2022/09/12 14:17