teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

前回の回答コードから Realm 版を作成

2021/11/27 12:29

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -24,4 +24,157 @@
24
24
  app:layout_constraintEnd_toEndOf="parent"
25
25
  app:layout_constraintStart_toStartOf="parent"
26
26
  app:layout_constraintTop_toBottomOf="@+id/bt_add" />
27
+ ```
28
+
29
+ ----
30
+
31
+ 前のご質問の回答の [https://github.com/Jimbe-github/teratail-q370729](https://github.com/Jimbe-github/teratail-q370729) のレイアウトを使って、Realm( と RealmBaseAdapter) で動作するものになりましたので、ご提示させていただきます。
32
+ ```kotlin
33
+ import androidx.appcompat.app.AppCompatActivity
34
+ import android.os.Bundle
35
+ import android.view.View
36
+ import android.view.ViewGroup
37
+ import android.widget.*
38
+ import androidx.appcompat.app.AlertDialog
39
+ import io.realm.Realm
40
+
41
+ import io.realm.RealmBaseAdapter;
42
+ import android.view.LayoutInflater
43
+ import io.realm.RealmObject
44
+
45
+ import io.realm.annotations.PrimaryKey
46
+
47
+ open class Memo : RealmObject() {
48
+ @PrimaryKey
49
+ var name:String = ""
50
+ var age:Int = 0
51
+ var text:String = ""
52
+ }
53
+
54
+ class MainActivity : AppCompatActivity() {
55
+ //lateinit var dba: DatabaseAccesser
56
+ private lateinit var realm: Realm
57
+
58
+ override fun onCreate(savedInstanceState: Bundle?) {
59
+ super.onCreate(savedInstanceState)
60
+ setContentView(R.layout.activity_main)
61
+
62
+ val et_name : EditText = findViewById(R.id.et_name)
63
+ val bt_add : Button = findViewById(R.id.bt_add)
64
+ val bt_delete : Button = findViewById(R.id.bt_delete)
65
+ val lv : ListView = findViewById(R.id.lv)
66
+
67
+ //dba = SQLiteDatabaseAccesser(this)
68
+ realm = Realm.getDefaultInstance();
69
+
70
+ val adapter = RealmMemoAdapter(realm)
71
+ lv.adapter = adapter
72
+
73
+ //bt_addを押すとet_nameに入力した内容をDBに保存とListViewに表示する処理を記載する
74
+ bt_add.setOnClickListener {
75
+ if(et_name.text.toString().isEmpty()){
76
+ AlertDialog.Builder(this)
77
+ .setTitle("未入力")
78
+ .setMessage("名前を入力して下さい")
79
+ .setPositiveButton("OK",null)
80
+ .show()//et_nameが未入力の場合、アラートダイアログで表示
81
+ }else{
82
+ val name = et_name.text.toString()
83
+ adapter.add(name, 0, "")
84
+ et_name.text.clear()//DBに書き込みしたらEditTextの文字をクリアする
85
+ Toast.makeText(applicationContext, "登録しました", Toast.LENGTH_SHORT).show()//トーストで表示
86
+ }
87
+ }
88
+
89
+ //ListViewをタップするとアラートダイアログを表示して、削除するかしないか判断する
90
+ //合わせてDBに登録されているデータも一緒に削除する
91
+ lv.setOnItemClickListener { _, _, position, _ ->
92
+ AlertDialog.Builder(this)
93
+ .setTitle("削除しますか??")
94
+ .setPositiveButton("Yes") { _, _ ->
95
+ //Yesを押下した時の処理
96
+ //タップされたところのメモの削除
97
+ adapter.remove(position)
98
+ et_name.text.clear()
99
+ //Toast.makeText(applicationContext,"削除しました",Toast.LENGTH_SHORT).show()
100
+ }
101
+ .setNegativeButton("No") { _, _ ->
102
+ Toast.makeText(applicationContext, "キャンセルしました", Toast.LENGTH_SHORT).show()
103
+ }
104
+ .show()
105
+ }
106
+ //これは予備コード
107
+ //DB全削除用
108
+ bt_delete.setOnClickListener {
109
+ realm.executeTransactionAsync {
110
+ it.where(Memo::class.java).findAll().deleteAllFromRealm()
111
+ }
112
+ }
113
+ }
114
+
115
+ override fun onDestroy() {
116
+ super.onDestroy()
117
+ //dba.destroy()
118
+ realm.close()
119
+ }
120
+ }
121
+
122
+ class RealmMemoAdapter(val realm:Realm) : RealmBaseAdapter<Memo>(null) {
123
+ init {
124
+ adapterData = realm.where(Memo::class.java).findAll()
125
+ }
126
+ class ViewHolder(view: View) {
127
+ var nameText: TextView
128
+ var ageText: TextView
129
+ var textText: TextView
130
+ init {
131
+ nameText = view.findViewById(R.id.nameText) as TextView
132
+ ageText = view.findViewById(R.id.ageText) as TextView
133
+ textText = view.findViewById(R.id.textText) as TextView
134
+ }
135
+ }
136
+
137
+ override fun getView(position: Int, view: View?, parent: ViewGroup?): View {
138
+ val v = view ?:
139
+ LayoutInflater.from(parent!!.context).inflate(R.layout.row_layout,null).apply {
140
+ tag = ViewHolder(this)
141
+ }
142
+
143
+ val vh = v.tag as ViewHolder
144
+ val memo:Memo = adapterData!!.get(position)
145
+ vh.nameText.text = memo.name
146
+ vh.ageText.text = memo.age.toString()
147
+ vh.textText.text = memo.text
148
+
149
+ return v
150
+ }
151
+
152
+ fun add(name:String, age:Int, text:String) {
153
+ realm.executeTransactionAsync(
154
+ Realm.Transaction {
155
+ it.createObject(Memo::class.java, name).apply {
156
+ this.age = age
157
+ this.text = text
158
+ }
159
+ },
160
+ Realm.Transaction.OnSuccess {
161
+ notifyDataSetChanged()
162
+ }
163
+ )
164
+ }
165
+
166
+ fun remove(position:Int) {
167
+ adapterData!!.get(position).let {
168
+ val name = it.name
169
+ realm.executeTransactionAsync(
170
+ Realm.Transaction {
171
+ it.where(Memo::class.java).equalTo("name", name).findFirst()?.deleteFromRealm()
172
+ },
173
+ Realm.Transaction.OnSuccess {
174
+ notifyDataSetChanged()
175
+ }
176
+ )
177
+ }
178
+ }
179
+ }
27
180
  ```

2

追記

2021/11/27 12:29

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -1,4 +1,4 @@
1
- していません!
1
+ 動作は確認していません!
2
2
 
3
3
  初期データの読み込みであれば、 adapter を作る際に findAll で読み込みしては如何でしょうか。
4
4
 
@@ -10,8 +10,8 @@
10
10
  val adapter = ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1, list)
11
11
  lv.adapter = adapter
12
12
  ```
13
-
14
13
  また、レイアウトの ListView の設定を変えないと表示されないかもしれません。
14
+ (layout_width,layout_height の変更、layout_constraintBottom_toBottomOf 追加)
15
15
  ```xml
16
16
  <ListView
17
17
  android:id="@+id/lv"

1

Realm.getDefaultInstance() を前に移動

2021/11/26 08:29

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -3,6 +3,9 @@
3
3
  初期データの読み込みであれば、 adapter を作る際に findAll で読み込みしては如何でしょうか。
4
4
 
5
5
  ```kotlin
6
+ //Realmを使う時に必要
7
+ val realm = Realm.getDefaultInstance() // <- 前に移動
8
+
6
9
  val list = mutableListOf(realm.where(user::class.java).findAll())
7
10
  val adapter = ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1, list)
8
11
  lv.adapter = adapter