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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

2回答

547閲覧

【Android Studio】DB(SQLite)に保存した内容を同じカスタムアダプターを使って複数表示する方法

YonHan

総合スコア40

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2022/01/22 04:29

編集2022/01/22 04:44

前提・実現したいこと

SQLiteのDBで9列(ID,TITLE,DATE,TIME,ToDo1,ToDo2,ToDo3,ToDo4,ToDo5)のテーブルを作り、5つの内容(ToDo1,ToDo2,ToDo3,ToDo4,ToDo5{全てTEXT})を同じカスタムアダプターを使って、ListViewに追加したいです。

該当のソースコード

ToDoAdapter(使いたいアダプター)

1package com.example.todoschedule; 2 3//TODO todoテスト変更1 4 5import android.content.Context; 6import android.view.LayoutInflater; 7import android.view.View; 8import android.view.ViewGroup; 9import android.widget.ArrayAdapter; 10import android.widget.TextView; 11 12import java.util.ArrayList; 13 14public class ToDoAdapter extends ArrayAdapter<User> { 15 16 private LayoutInflater mInflater; 17 private ArrayList<User> users; 18 private int mViewResourceId; 19 20 public ToDoAdapter(Context context, int textViewResourceId, ArrayList<User> users) { 21 super(context, textViewResourceId, users); 22 this.users = users; 23 mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 24 mViewResourceId = textViewResourceId; 25 } 26 27 public View getView(int position, View convertView, ViewGroup parent) { 28 convertView = mInflater.inflate(mViewResourceId, null); 29 30 User user = users.get(getCount() - 1 - position); 31 32 if (user != null) { 33 34 TextView todo1Name = (TextView) convertView.findViewById(R.id.todo_title); 35 36 TextView time = (TextView) convertView.findViewById(R.id.time); 37 if (todo1Name != null) { 38 todo1Name.setText(user.getTodo1Name()); 39 } 40 41 if (time != null) { 42 time.setText(user.getTime()); 43 } 44 } 45 46 return convertView; 47 } 48}

ToDoAdapterのxml

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="horizontal" android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:weightSum="100"> 6 7 <TextView 8 android:textStyle="bold" 9 android:textSize="20sp" 10 android:layout_weight="30" 11 android:layout_width="match_parent" 12 android:layout_height="25dp" 13 android:id="@+id/todo_title"/> 14 <TextView 15 android:textStyle="bold" 16 android:textSize="20sp" 17 android:layout_weight="30" 18 android:layout_width="match_parent" 19 android:layout_height="25dp" 20 android:id="@+id/time"/> 21 22 <CheckBox 23 android:id="@+id/todo_delete" 24 android:layout_width="match_parent" 25 android:layout_height="25dp" 26 android:layout_weight="39" /> 27 28</LinearLayout>

リストAタップすると同じIDの内容がリストBに表示されるようになってます、
その時リストBに5個のアイテムが追加されるようにしたい。
質問した時のページ
↓Tab05まである、

Tab01(表示する処理)

1package com.example.todoschedule; 2import android.app.Activity; 3import android.content.DialogInterface; 4import android.content.Intent; 5import android.database.Cursor; 6import android.database.sqlite.SQLiteDatabase; 7import android.os.Bundle; 8import android.view.View; 9import android.widget.AdapterView; 10import android.widget.ListView; 11 12import androidx.appcompat.app.AlertDialog; 13 14import java.util.ArrayList; 15 16public class Tab_01 extends Activity { 17 18 DBHelper_1 DBHelper1; 19 ArrayList<User> userList; 20 ListView listView,listView1; 21 User user; 22 23 SQLiteDatabase db; 24 25 @Override 26 protected void onCreate( 27 Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.activity_tab01); 30 listView1 = (ListView) findViewById(R.id.lv1_1); 31// final CheckBox deleteTodo1 = (CheckBox) findViewById(R.id.todo_delete); 32 //TODO エラーおきる android studio checkbox setonClickListener 33// deleteTodo1.setOnClickListener(new View.OnClickListener(){ 34// @Override 35// public void onClick(View v) { 36// // 処理を記述 37// } 38// }); 39 40 } 41 42 public void onaddButtonClick1(View view) { 43 Intent intent = new Intent(getApplication(), add.class); 44 intent.putExtra("ScreenBefore","Tab_01"); 45 startActivity(intent); 46 } 47 48 @Override 49 //他のアクティビティから戻る際にListViewを更新したいためonResumeに記述 50 protected void onResume() { 51 super.onResume(); 52 53 DBHelper1 = new DBHelper_1(this); 54 userList = new ArrayList<>(); 55 Cursor data = DBHelper1.getListContents(); 56 57 //TODO todoテスト変更2 58 int i=0; 59 while(data.moveToNext()){ 60 user = new User(data.getLong(0),data.getString(1),data.getString(2),data.getString(3),data.getString(4), 61 data.getString(5),data.getString(6),data.getString(7),data.getString(8)); 62 userList.add(i,user); 63 //System.out.println(data.getString(3)+" "+data.getString(4)); 64 System.out.println(data.getString(1)+" "+data.getString(2)); 65 System.out.println(userList.get(i).getTitleName()); 66 i++; 67 } 68 TwoColumnAdapter adapter = new TwoColumnAdapter(this,R.layout.lv_adapter, userList); 69 listView = (ListView) findViewById(R.id.lv1); 70 listView.setAdapter(adapter); 71 listView.setOnItemClickListener(new OnItemClickListener()); 72 listView.setOnItemLongClickListener(new OnItemLongClickListener()); 73 74 } 75 //タブ1のリストを押した場合 76 public class OnItemClickListener implements AdapterView.OnItemClickListener { 77 public void onItemClick(AdapterView<?> adapter, View view, int position, long id) { 78 79 ArrayList<User> data1 = new ArrayList<>(); 80 //int numRows = data.getCount(); 81 //★IDの取得★ 82 User user = userList.get(userList.size() - 1 - position); 83 long UserId = user.getId(); 84 85 //リストに表示 86 for(User u : userList) { 87 if(u.getId() == UserId){ 88 data1.add(u); 89 90 } 91 } 92 93 //TODO todoテスト変更2 94 ToDoAdapter todoadapter = new ToDoAdapter(getApplicationContext(), R.layout.todo_adapter, data1); 95 listView1.setAdapter(todoadapter); 96 97 //db.execSQL("SELECT TODO1NAME FROM lv1_data WHERE ID ==" + UserId); 98 99 } 100 } 101 102 //タブ1のリストを長押しした場合 103 private class OnItemLongClickListener implements AdapterView.OnItemLongClickListener { 104 105 public boolean onItemLongClick(AdapterView<?> parent, View view , int position, long id) { 106 //ダイアログ準備 107 AlertDialog.Builder builder = new AlertDialog.Builder(Tab_01.this); 108 builder.setTitle("削除しますか?"); 109 builder.setPositiveButton("はい", new DialogInterface.OnClickListener() { 110 @Override 111 public void onClick(DialogInterface dialog, int which) { 112 113 } 114 }); 115 builder.setNegativeButton("いいえ",null); 116 builder.setCancelable(true); 117 builder.show(); 118 return true; 119 } 120 } 121}

↓タブは5個あり、DBも5個あります
add(DBに追加する値を入力する処理をする)
リンク

考えたこと

リストAを押した時の処理にリストBに追加(setではなくadd)する処理を入れる
→拡張For文?

補足情報(FW/ツールのバージョンなど)

Gradleバージョン:7.0.2

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

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

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

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

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

jimbe

2022/01/24 08:20

何かごちゃごちゃしていますが、要は listView1 で User の一つを選択したら その User に含まれる todo の数だけ listView2 に表示するということで、データベースやらタブやらは直接は関係しないということでしょうか。
YonHan

2022/01/26 09:16

はい、そうです。
guest

回答2

0

上のリストで一行選ぶと、 その位置の user を下のアダプタに設定しています。

java

1import androidx.appcompat.app.AppCompatActivity; 2 3import android.os.Bundle; 4import android.view.*; 5import android.widget.*; 6 7import java.util.*; 8 9public class MainActivity extends AppCompatActivity { 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.activity_main); 14 15 //テストデータ 16 List<User> userList = new ArrayList<>(); 17 userList.add(new User("titleA","2/10","14:00", "todoA1","todoA2",null,null,null)); 18 userList.add(new User("titleB","2/20","10:00", "todoB1",null,"todoB3",null,null)); 19 userList.add(new User("titleC","2/25","12:00", "todoC1","todoC2","todoC3","todoC4","todoC5")); 20 21 ListView listView1 = findViewById(R.id.listView1); 22 ListView listView2 = findViewById(R.id.listView2); 23 24 UserAdapter userAdapter = new UserAdapter(userList); 25 listView1.setAdapter(userAdapter); 26 27 TodoAdapter todoAdapter = new TodoAdapter(); 28 listView2.setAdapter(todoAdapter); 29 30 //list1 が選択されたら list2 に設定する 31 listView1.setOnItemClickListener((adapterView, view, position, id) -> { 32 todoAdapter.setUser((User)userAdapter.getItem(position)); 33 }); 34 } 35} 36 37class User { 38 static class Todo { 39 final int num; 40 final String text; 41 Todo(int num, String text) { 42 this.num = num; 43 this.text = text; 44 } 45 } 46 final String title; 47 final String date; 48 final String time; 49 final List<Todo> todoList = new ArrayList<>(); 50 User(String title, String date, String time, String... todos) { 51 if(todos.length > 5) throw new IllegalArgumentException(); 52 this.title = title; 53 this.date = date; 54 this.time = time; 55 56 for(int i=0; i<todos.length; i++) if(todos[i] != null) todoList.add(new Todo(i+1, todos[i])); 57 } 58} 59 60class UserAdapter extends BaseAdapter { 61 private List<User> userList; 62 63 UserAdapter(List<User> userList) { 64 this.userList = userList; 65 } 66 67 @Override 68 public int getCount() { 69 if(userList == null) return 0; 70 return userList.size(); 71 } 72 73 @Override 74 public Object getItem(int position) { 75 return userList.get(position); 76 } 77 78 @Override 79 public long getItemId(int position) { 80 return position; 81 } 82 83 private class ViewHolder { 84 final TextView titleText; 85 final TextView dateText; 86 ViewHolder(View v) { 87 titleText = v.findViewById(R.id.title); 88 dateText = v.findViewById(R.id.date); 89 } 90 } 91 92 @Override 93 public View getView(int position, View view, ViewGroup viewGroup) { 94 if(view == null) { 95 view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.listview1_row, viewGroup, false); 96 view.setTag(new ViewHolder(view)); 97 } 98 ViewHolder vh = (ViewHolder)view.getTag(); 99 User user = userList.get(position); 100 vh.titleText.setText(user.title); 101 vh.dateText.setText(user.date); 102 103 return view; 104 } 105} 106 107class TodoAdapter extends BaseAdapter { 108 private User user = null; 109 110 void setUser(User user) { 111 this.user = user; 112 notifyDataSetChanged(); //ListView に表示内容が替わったことを知らせ、再表示を促す 113 } 114 115 @Override 116 public int getCount() { 117 if(user == null) return 0; 118 return user.todoList.size(); 119 } 120 121 @Override 122 public Object getItem(int position) { 123 return user.todoList.get(position); 124 } 125 126 @Override 127 public long getItemId(int position) { 128 return position; 129 } 130 131 private class ViewHolder { 132 final TextView titleText; 133 final TextView timeText; 134 final TextView todoText; 135 ViewHolder(View v) { 136 titleText = v.findViewById(R.id.title); 137 timeText = v.findViewById(R.id.time); 138 todoText = v.findViewById(R.id.todo); 139 } 140 } 141 142 @Override 143 public View getView(int position, View view, ViewGroup viewGroup) { 144 if(view == null) { 145 view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.listview2_row, viewGroup, false); 146 view.setTag(new ViewHolder(view)); 147 } 148 ViewHolder vh = (ViewHolder)view.getTag(); 149 vh.titleText.setText(user.title); 150 vh.timeText.setText(user.time); 151 vh.todoText.setText(user.todoList.get(position).num + "." + user.todoList.get(position).text); 152 153 return view; 154 } 155}

activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 <ListView 10 android:id="@+id/listView1" 11 android:layout_width="0dp" 12 android:layout_height="0dp" 13 app:layout_constraintBottom_toTopOf="@id/listView2" 14 app:layout_constraintLeft_toLeftOf="parent" 15 app:layout_constraintRight_toRightOf="parent" 16 app:layout_constraintTop_toTopOf="parent" /> 17 <ListView 18 android:id="@+id/listView2" 19 android:layout_width="0dp" 20 android:layout_height="0dp" 21 app:layout_constraintBottom_toBottomOf="parent" 22 app:layout_constraintLeft_toLeftOf="parent" 23 app:layout_constraintRight_toRightOf="parent" 24 app:layout_constraintTop_toBottomOf="@id/listView1" /> 25</androidx.constraintlayout.widget.ConstraintLayout>

listview1_row.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 android:layout_width="match_parent" 6 android:layout_height="wrap_content"> 7 8 <TextView 9 android:id="@+id/title" 10 android:layout_width="0dp" 11 android:layout_height="match_parent" 12 app:layout_constraintLeft_toLeftOf="parent" 13 app:layout_constraintRight_toLeftOf="@id/date" 14 app:layout_constraintTop_toTopOf="parent" /> 15 <TextView 16 android:id="@+id/date" 17 android:layout_width="0dp" 18 android:layout_height="match_parent" 19 app:layout_constraintLeft_toRightOf="@id/title" 20 app:layout_constraintRight_toRightOf="parent" 21 app:layout_constraintTop_toTopOf="parent" /> 22</androidx.constraintlayout.widget.ConstraintLayout>

listview2_row.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 android:layout_width="match_parent" 6 android:layout_height="wrap_content"> 7 8 <TextView 9 android:id="@+id/title" 10 android:layout_width="0dp" 11 android:layout_height="match_parent" 12 app:layout_constraintLeft_toLeftOf="parent" 13 app:layout_constraintRight_toLeftOf="@id/time" 14 app:layout_constraintTop_toTopOf="parent" /> 15 <TextView 16 android:id="@+id/time" 17 android:layout_width="0dp" 18 android:layout_height="match_parent" 19 app:layout_constraintLeft_toRightOf="@id/title" 20 app:layout_constraintRight_toLeftOf="@id/todo" 21 app:layout_constraintTop_toTopOf="parent" /> 22 <TextView 23 android:id="@+id/todo" 24 android:layout_width="0dp" 25 android:layout_height="match_parent" 26 app:layout_constraintLeft_toRightOf="@id/time" 27 app:layout_constraintRight_toRightOf="parent" 28 app:layout_constraintTop_toTopOf="parent" /> 29</androidx.constraintlayout.widget.ConstraintLayout>

投稿2022/01/26 15:00

jimbe

総合スコア12646

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

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

YonHan

2022/01/27 03:36

DBに保存された内容を表示する場合はどうすればよいですか? DB構成→https://www.ideone.com/gYngWF
jimbe

2022/01/27 03:55

テストデータを生成している部分をデータベースから List<User> を作るように置き換えれば同じになります。 ある程度以上の規模のコードを書くのでしたら、例えば会社に属する人々がそれぞれに役割を持つようにプログラムの構成要素を役割毎にクラス化して、その各クラスがどのように(何によって)関係するかを考えることをお勧めします。 それによって処理を置き換えたりが出来るようになり、本件のようにデータベースが関係無ければテストデータを直接用意することができます。
YonHan

2022/01/28 02:55

List<User> userList = new ArrayList<>(); Cursor data = DB1.getListContents(); while(data.moveToNext()){ userList.add(new User(data.getString(1),data.getString(2),data.getString(3),     data.getString(4), data.getString(5),data.getString(6),data.getString(7),data.getString(8))); } すいません,出来ません。。。
jimbe

2022/01/28 03:42

謝る必要はありません。 そのデータベースアクセスのコードをどこに入れるとどうなったのでしょうか。 なお、回答のコードは「上のリストを選択したら下のリストに内容が表示される」サンプルであって、このご質問でご提示されたコードで参考になる部分以外は新たに作成したもので、例えば User クラスが YonHan さんの手元にある User クラスと同じとは限りません。(確認していません。) つまり、コードをご理解頂いて「なぜ」出来るのかという要素を抽出してご自身のプロジェクトに適用して頂く必要があります。
jimbe

2022/01/28 10:17

SQLite にテストデータを入れてそこから読むようにしたコードを (回答に書ききれなくなったようですので) GitHub に入れました。 (DB の構造はほぼ同じですがヘルパークラスは変えています。) https://github.com/Jimbe-github/teratail-q_tejy7wchc1rqto
YonHan

2022/01/28 11:54

テストデータの時と同じようにuserList.addで追加しようとしました、そしてデータの中身のこのコードはDBHelperのgetListContents()を利用し、DBからデータを持ってこようと思いました。 ちなみにUserクラスはこんな感じです。 https://www.ideone.com/DTyszz
guest

0

自己解決

普通に元のコードのように

int i=0; while(data.moveToNext()){ user = new User(data.getString(1),data.getString(2),data.getString(3),data.getString(4), data.getString(5),data.getString(6),data.getString(7),data.getString(8)); userList.add(i,user); //System.out.println(data.getString(3)+" "+data.getString(4)); System.out.println(data.getString(1)+" "+data.getString(2)); System.out.println(userList.get(i).getTitleName()); i++; }

と記述したらデータ追加できました。
jimbeさん回答本当にありがとうございます。

投稿2022/01/29 05:10

YonHan

総合スコア40

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問