回答編集履歴

3

データベースの更新を MainActivity に移す例を追加

2019/08/21 15:06

投稿

jimbe
jimbe

スコア12632

test CHANGED
@@ -69,3 +69,123 @@
69
69
  ```
70
70
 
71
71
  で済むように思います.
72
+
73
+
74
+
75
+ ----
76
+
77
+ データベースの更新を MainActivity に移す例(カスタムリスナ)です:
78
+
79
+
80
+
81
+ AlarmsAdapter にリスナ関係を追加します.
82
+
83
+ ```java
84
+
85
+ static interface AlarmSwitchListener {
86
+
87
+ void onAlermSwitchChanged(int id, boolean isChecked);
88
+
89
+ }
90
+
91
+ private AlarmSwitchListener alarmSwitchListener;
92
+
93
+ void setAlarmSwitchListener(AlarmSwitchListener l) {
94
+
95
+ alarmSwitchListener = l;
96
+
97
+ }
98
+
99
+ ```
100
+
101
+ alarm_switch_upd の呼び出しをリスナの呼び出しに変更します.
102
+
103
+ その際, alarm_switch_upd 内にある sw_alarm の設定はこちらに抜き出しておきます.
104
+
105
+ ```java
106
+
107
+ //アラームスイッチ変更
108
+
109
+ holder.sw_alarm.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
110
+
111
+ @Override
112
+
113
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
114
+
115
+ AlarmList.get(position).sw_alarm = isChecked;
116
+
117
+ if(alarmSwitchListener != null) { //リスナが登録されていたら呼び出す
118
+
119
+ alarmSwitchListener.onAlermSwitchChanged(rowData.id, isChecked);
120
+
121
+ }
122
+
123
+ }
124
+
125
+ });
126
+
127
+ ```
128
+
129
+ MainActivity でリスナを実装, Adapter 作成時に自身をリスナとして登録します.
130
+
131
+ ```
132
+
133
+ public class MainActivity extends AppCompatActivity implements AlarmsAdapter.AlarmSwitchListener {
134
+
135
+ :
136
+
137
+ @Override
138
+
139
+ protected void onCreate(Bundle savedInstanceState) {
140
+
141
+ :
142
+
143
+ AlarmsAdapter adapter = new AlarmsAdapter( ... );
144
+
145
+ adapter.setAlarmSwitchListener(this);
146
+
147
+ :
148
+
149
+ }
150
+
151
+ :
152
+
153
+ //アラームスイッチ更新
154
+
155
+ @Override
156
+
157
+ public void onAlermSwitchChanged(int id, boolean isChecked) {
158
+
159
+ //alarm_switch_upd にあった内容です.
160
+
161
+ //dbオープン
162
+
163
+ MySQLiteOpenHelper helper = new MySQLiteOpenHelper(this); //MainActivity は Context としても使えます
164
+
165
+ try{
166
+
167
+ mydb = helper.getWritableDatabase();
168
+
169
+ }catch(SQLiteException e){
170
+
171
+ //異常終了
172
+
173
+ return;
174
+
175
+ }
176
+
177
+
178
+
179
+ //アラームテーブルのスイッチ更新
180
+
181
+ String update_table = "update alarm_table " +
182
+
183
+ "set switch = '" + isChecked + "'" +
184
+
185
+ " where _id = " + id;
186
+
187
+ mydb.execSQL(update_table);
188
+
189
+ }
190
+
191
+ ```

2

ついで

2019/08/21 15:06

投稿

jimbe
jimbe

スコア12632

test CHANGED
@@ -15,3 +15,57 @@
15
15
  :
16
16
 
17
17
  ```
18
+
19
+
20
+
21
+ ----
22
+
23
+ ついでですが,
24
+
25
+ ```java
26
+
27
+ if(holder.sw_alarm.isChecked()) {
28
+
29
+ //mSwitch : Off -> On の時の処理
30
+
31
+ // コンテキスト取得
32
+
33
+ context = buttonView.getContext();
34
+
35
+ //アラームスイッチ更新
36
+
37
+ alarm_switch_upd(holder.sw_alarm.isChecked() ,position);
38
+
39
+ } else {
40
+
41
+ //mSwitch : On -> Off の時の処理
42
+
43
+ // コンテキスト取得
44
+
45
+ context = buttonView.getContext();
46
+
47
+ //アラームスイッチ更新
48
+
49
+ alarm_switch_upd(holder.sw_alarm.isChecked() ,position);
50
+
51
+ }
52
+
53
+ ```
54
+
55
+ この if 文は Off->On も On->Off も同じなのですが, if 文の必要があるのでしょうか.
56
+
57
+ また ```holder.sw_alarm.isChecked()``` はパラメータに ```isClicked``` がありますし, context は何に使うのか分かりません.
58
+
59
+
60
+
61
+ 単純に
62
+
63
+ ```java
64
+
65
+ //アラームスイッチ更新
66
+
67
+ alarm_switch_upd(isChecked, position);
68
+
69
+ ```
70
+
71
+ で済むように思います.

1

正確化

2019/08/20 17:14

投稿

jimbe
jimbe

スコア12632

test CHANGED
@@ -1,4 +1,4 @@
1
- notifyDataSetChanged によって RecyclerList が再表示を行おうと 全データに対し onBindViewHolder を呼び出し, スイッチを On にした行で setChecked を実行した際に そのスイッチに残っている Listener によって再度 notifyDataSetChanged が呼ばれ... と無限ループするので, 例外が発生するということですね.
1
+ notifyDataSetChanged によって RecyclerList が再表示を行おうと 全データに対し onBindViewHolder を呼び出し, スイッチを On にした行で setChecked を実行した際に そのスイッチに残っている OnCheckedChangeListener によって再度 notifyDataSetChanged が呼ばれ... と無限ループするので, 例外が発生するということですね.
2
2
 
3
3
 
4
4