回答編集履歴

3

バグがあったため修正を追加

2019/12/21 08:43

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -203,3 +203,99 @@
203
203
  //(後略)
204
204
 
205
205
  ```
206
+
207
+
208
+
209
+ #追記2
210
+
211
+ 上のコードでは onAttach 実行時は adapter がまだ new されていないため, NullPointerExeption が発生します.
212
+
213
+ onCreateView の adapter 生成部分を onAttack に移すことで解決します.
214
+
215
+ 以下のコードでは adapter 生成部分をメソッド化しています.
216
+
217
+
218
+
219
+ MemoListFragment.java
220
+
221
+ ```java
222
+
223
+ @Override
224
+
225
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
226
+
227
+ View view = inflater.inflate(R.layout.fragment_memo_list, container, false);
228
+
229
+ fab = view.findViewById(R.id.intentEditMemo);
230
+
231
+ //以下を削除
232
+
233
+ //realm = Realm.getDefaultInstance(); // Realmをインスタンス化
234
+
235
+ //final RealmResults<Memo> result = realm.where(Memo.class).findAll() // テーブルから全レコード取得
236
+
237
+ // .sort("id", Sort.DESCENDING);// 降順にソート
238
+
239
+ //adapter = new MemoAdapter(result); // その結果をアダプターに渡す
240
+
241
+
242
+
243
+ recyclerView = view.findViewById(R.id.memoList);
244
+
245
+ recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
246
+
247
+ recyclerView.setAdapter(adapter);
248
+
249
+ recyclerView.setHasFixedSize(true);
250
+
251
+ recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL));
252
+
253
+
254
+
255
+ return view;
256
+
257
+ }
258
+
259
+
260
+
261
+ //追加
262
+
263
+ //MemoAdapter を生成する.
264
+
265
+ private MemoAdapter createMemoAdapter(MemoListActivity memoListActivity) {
266
+
267
+ realm = Realm.getDefaultInstance(); // Realmをインスタンス化
268
+
269
+ final RealmResults<Memo> result = realm.where(Memo.class).findAll() // テーブルから全レコード取得
270
+
271
+ .sort("id", Sort.DESCENDING);// 降順にソート
272
+
273
+ adapter = new MemoAdapter(result); // その結果をアダプターに渡す
274
+
275
+ adapter.setActivity(memoListActivity);
276
+
277
+ }
278
+
279
+
280
+
281
+ //アクティビティに載せられると呼ばれる
282
+
283
+ @Override
284
+
285
+ public void onAttach(Context context) {
286
+
287
+ super.onAttach(context);
288
+
289
+ if (context instanceof MemoListActivity) {
290
+
291
+ memoListActivity = (MemoListActivity) context;
292
+
293
+ //adapter.setActivity(memoListActivity); //削除
294
+
295
+ adapter = createMemoAdapter(memoListActivity); //追加
296
+
297
+ }
298
+
299
+ }
300
+
301
+ ```

2

文言追加

2019/12/21 08:43

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- EditMemoFragment への遷移をアクティビティ(に新設したメソッド)に集約して, MemoListFragment での新規ボタン押下時および MemoAdapter による既存選択時(?)にそのメソッドを呼ぶように修正するコードです.
15
+ EditMemoFragment への遷移をアクティビティ(に新設したメソッド)に集約して, MemoListFragment での新規ボタン押下時および MemoAdapter (を設定した RecyclerView) による既存選択時(?)にそのメソッドを呼ぶように修正するコードです.
16
16
 
17
17
 
18
18
 

1

回答追加

2019/12/19 15:18

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -3,3 +3,203 @@
3
3
 
4
4
 
5
5
  Fragment.getFragmentManager() は, そのフラグメントが Activity に接続した状態でなければ null を返します.
6
+
7
+
8
+
9
+ ---
10
+
11
+ #追記
12
+
13
+
14
+
15
+ EditMemoFragment への遷移をアクティビティ(に新設したメソッド)に集約して, MemoListFragment での新規ボタン押下時および MemoAdapter による既存選択時(?)にそのメソッドを呼ぶように修正するコードです.
16
+
17
+
18
+
19
+ **※テストは出来ていません**
20
+
21
+
22
+
23
+ MemoListActivity.java
24
+
25
+ ```java
26
+
27
+ //(前略)
28
+
29
+
30
+
31
+ //追加
32
+
33
+ //EditMemoFragment に遷移する
34
+
35
+ void replaceToEditMemoFragment(String id) {
36
+
37
+ Bundle bundle = new Bundle();
38
+
39
+ bundle.putString("id", id);
40
+
41
+ EditMemoFragment fragment = new EditMemoFragment();
42
+
43
+ fragment.setArguments(bundle);
44
+
45
+ getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
46
+
47
+ }
48
+
49
+
50
+
51
+ //(後略)
52
+
53
+ ```
54
+
55
+
56
+
57
+ MemoListFragment.java
58
+
59
+ ```java
60
+
61
+ //(前略)
62
+
63
+
64
+
65
+ //追加
66
+
67
+ //アクティビティに載せられると呼ばれる
68
+
69
+ @Override
70
+
71
+ public void onAttach(Context context) {
72
+
73
+ super.onAttach(context);
74
+
75
+ if (context instanceof MemoListActivity) {
76
+
77
+ memoListActivity = (MemoListActivity) context;
78
+
79
+ adapter.setActivity(memoListActivity);
80
+
81
+ }
82
+
83
+ }
84
+
85
+
86
+
87
+ //追加
88
+
89
+ //アクティビティから外されると呼ばれる
90
+
91
+ @Override
92
+
93
+ public void onDetach() {
94
+
95
+ super.onDetach();
96
+
97
+ memoListActivity = null;
98
+
99
+ adapter.setActivity(null);
100
+
101
+ }
102
+
103
+
104
+
105
+ //(中略)
106
+
107
+
108
+
109
+ //新規作成ボタン
110
+
111
+ fab.setOnClickListener(new View.OnClickListener() {
112
+
113
+ @Override
114
+
115
+ public void onClick(View view) {
116
+
117
+ memoListActivity.replaceToEditMemoFragment("");
118
+
119
+ //以下削除
120
+
121
+ //Bundle bundle = new Bundle();
122
+
123
+ //bundle.putString("id", "");
124
+
125
+ //EditMemoFragment fragment = new EditMemoFragment();
126
+
127
+ //fragment.setArguments(bundle);
128
+
129
+ //FragmentTransaction transaction = getFragmentManager().beginTransaction();
130
+
131
+ //transaction.replace(R.id.container, fragment.newInstance(),"EditMemoFragment").commit();
132
+
133
+ }
134
+
135
+ });
136
+
137
+
138
+
139
+ //(後略)
140
+
141
+ ```
142
+
143
+
144
+
145
+ MemoAdapter.java
146
+
147
+ ```java
148
+
149
+ public class MemoAdapter extends RealmRecyclerViewAdapter<Memo, MemoAdapter.MemoViewHolder> {
150
+
151
+ private MemoListActivity memoListActivity; //追加
152
+
153
+ private OrderedRealmCollection<Memo> mDataset;
154
+
155
+
156
+
157
+ //追加
158
+
159
+ //フラグメント遷移処理メソッドを持つアクティビティを設定
160
+
161
+ void setActivity(MemoListActivity memoListActivity) {
162
+
163
+ this.memoListActivity = memoListActivity;
164
+
165
+ }
166
+
167
+
168
+
169
+ //(中略)
170
+
171
+
172
+
173
+ // アイテムクリックされたら編集画面へ
174
+
175
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
176
+
177
+ @Override
178
+
179
+ public void onClick(View v) {
180
+
181
+ final String id = obj.getId();
182
+
183
+ memoListActivity.replaceToEditMemoFragment(id); //追加
184
+
185
+ //以下削除
186
+
187
+ //Bundle bundle = new Bundle();
188
+
189
+ //bundle.putString("id", id);
190
+
191
+ //EditMemoFragment fragment = new EditMemoFragment();
192
+
193
+ //fragment.setArguments(bundle);
194
+
195
+ //fragment.getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
196
+
197
+ }
198
+
199
+ });
200
+
201
+
202
+
203
+ //(後略)
204
+
205
+ ```