質問編集履歴

3

具体的に記入

2020/04/03 00:40

投稿

kbayashi
kbayashi

スコア18

test CHANGED
File without changes
test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  ###問題
8
8
 
9
- CalenderViewでRecyclerViewに表示されていないデータがある日付をタップすると
9
+ CalenderViewでRecyclerViewに表示されていないデータがある日付をタップするとMainActivityのcalendarView.setOnDateChangeListener内の
10
10
 
11
11
  var item = task_list.findViewHolderForAdapterPosition(counter) as TaskAdapter.ViewHolderでNullPointが発生します。これが、現在作成中のtodoアプリです。今現在見えていませんが、4月1日にもデータがあります。この状態でカレンダーの4月1日をタップするとnullpointExceptionが発生し強制終了します。2日の場合は表示されているのでスクロールされました。
12
12
 

2

nullpointを具体的に

2020/04/03 00:39

投稿

kbayashi
kbayashi

スコア18

test CHANGED
File without changes
test CHANGED
@@ -6,9 +6,9 @@
6
6
 
7
7
  ###問題
8
8
 
9
- CalenderViewでRecyclerViewに表示されていないデータがある日付をタップするとNullPointが発生します。
10
-
11
- これが、現在作成中のtodoアプリです。今現在見えていませんが、4月1日にもデータがあります。この状態でカレンダーの4月1日をタップするとnullpointExceptionが発生し強制終了します。2日の場合は表示されているのでスクロールされました。
9
+ CalenderViewでRecyclerViewに表示されていないデータがある日付をタップすると
10
+
11
+ var item = task_list.findViewHolderForAdapterPosition(counter) as TaskAdapter.ViewHolderでNullPointが発生します。これが、現在作成中のtodoアプリです。今現在見えていませんが、4月1日にもデータがあります。この状態でカレンダーの4月1日をタップするとnullpointExceptionが発生し強制終了します。2日の場合は表示されているのでスクロールされました。
12
12
 
13
13
  ![イメージ説明](486e2fff3922ae74ec3da7b8576262c7.jpeg)
14
14
 
@@ -124,6 +124,8 @@
124
124
 
125
125
  while (task.count()-1 > counter) {
126
126
 
127
+
128
+
127
129
  var item = task_list.findViewHolderForAdapterPosition(counter) as TaskAdapter.ViewHolder
128
130
 
129
131
  Log.e("aaa", item.date.text.toString())

1

具体的に書き直しました

2020/04/02 23:57

投稿

kbayashi
kbayashi

スコア18

test CHANGED
@@ -1 +1 @@
1
- アクティビティからRecyclerViewのデータを取得したい
1
+ CalenderViewの日付をタップし、RecyclerViewにそ日付と同じデータがある場合その位置までスクロールしたい
test CHANGED
@@ -1 +1,571 @@
1
+ ### 実現したいこと
2
+
1
- カレンダーの日付をタップするとRecyclerViewのアイテムを取得し、一つづつカレンダーの日付と比較、その日付に登録されているタスクが存在しているならそのタスクまでスクロールしたいのですが、どやってRecyclerViewのアイテムを取得でるのでしょうか?
3
+ 今現在todoアプリを作っています。CalenderViewの日付をタップし、RecyclerViewが保持しているデータを取得し、選択した日付とデータが保持している日付と照ら合わせ、一致しているならそのセルまでスクロールしたいのですがうまくいません。
4
+
5
+
6
+
7
+ ###問題
8
+
9
+ CalenderViewでRecyclerViewに表示されていないデータがある日付をタップするとNullPointが発生します。
10
+
11
+ これが、現在作成中のtodoアプリです。今現在見えていませんが、4月1日にもデータがあります。この状態でカレンダーの4月1日をタップするとnullpointExceptionが発生し強制終了します。2日の場合は表示されているのでスクロールされました。
12
+
13
+ ![イメージ説明](486e2fff3922ae74ec3da7b8576262c7.jpeg)
14
+
15
+
16
+
17
+ ###ソースコード
18
+
19
+ ```MainActivity
20
+
21
+
22
+
23
+ class MainActivity : AppCompatActivity() {
24
+
25
+ private lateinit var realm: Realm
26
+
27
+ private var date: String? = null
28
+
29
+ private var adapter: TaskAdapter? = null
30
+
31
+
32
+
33
+ override fun onCreate(savedInstanceState: Bundle?) {
34
+
35
+ super.onCreate(savedInstanceState)
36
+
37
+ setContentView(R.layout.activity_main)
38
+
39
+ setSupportActionBar(toolbar)
40
+
41
+ //インスタンスを取得
42
+
43
+ realm = Realm.getDefaultInstance()
44
+
45
+ task_list.layoutManager = LinearLayoutManager(this)
46
+
47
+ var task = realm.where<Task>().findAll()
48
+
49
+ task = task.sort("date")
50
+
51
+ adapter = TaskAdapter(task,realm)
52
+
53
+ task_list.adapter = adapter
54
+
55
+
56
+
57
+ //タスク 追加ボタンタップ
58
+
59
+ addTask.setOnClickListener { view ->
60
+
61
+ //日付を編集画面に渡す
62
+
63
+ val nowDate = Date()
64
+
65
+ var format = SimpleDateFormat("HH:mm")
66
+
67
+ val nowTime = format.format(nowDate)
68
+
69
+ //選択されず初期の状態で追加ボタンを押されたら現在日時を渡す
70
+
71
+ if(date == null){
72
+
73
+ format = SimpleDateFormat("yyyy/MM/dd")
74
+
75
+ date = format.format(nowDate)
76
+
77
+ }
78
+
79
+ val intent = Intent(this, newTaskAddActivity::class.java)
80
+
81
+ date += " ${nowTime}"
82
+
83
+ intent.putExtra("DATE",date)
84
+
85
+ startActivity(intent)
86
+
87
+ }
88
+
89
+ //カレンダーの日付が選択された時
90
+
91
+ calendarView.setOnDateChangeListener {
92
+
93
+ calendarView, year, month, day ->
94
+
95
+
96
+
97
+ date = "${year}/${month+1}/${day}"
98
+
99
+ var test = "${year}"
100
+
101
+ if(month < 10){
102
+
103
+ test += "/0${month+1}"
104
+
105
+ }else{
106
+
107
+ test += "/${month+1}"
108
+
109
+ }
110
+
111
+ if(day < 10){
112
+
113
+ test += "/0${day}"
114
+
115
+ }else{
116
+
117
+ test += "/${day}"
118
+
119
+ }
120
+
121
+ Log.e("counter", "${task.count()}")
122
+
123
+ var counter = 0
124
+
125
+ while (task.count()-1 > counter) {
126
+
127
+ var item = task_list.findViewHolderForAdapterPosition(counter) as TaskAdapter.ViewHolder
128
+
129
+ Log.e("aaa", item.date.text.toString())
130
+
131
+ if(item.date.text.toString() == test){
132
+
133
+ (task_list.getLayoutManager() as LinearLayoutManager).
134
+
135
+ scrollToPositionWithOffset(counter, 0)
136
+
137
+ return@setOnDateChangeListener
138
+
139
+ }
140
+
141
+ counter++
142
+
143
+
144
+
145
+ }
146
+
147
+
148
+
149
+ }
150
+
151
+
152
+
153
+ //adapterのlistenerに関数をセット
154
+
155
+ adapter?.setOnclickListener {id:Long? ->
156
+
157
+ val intent = Intent(this, TaskAddActivity::class.java)
158
+
159
+ .putExtra("task_id",id)
160
+
161
+ startActivity(intent)
162
+
163
+ }
164
+
165
+
166
+
167
+ //switchが切り替わった時の処理をリスナーに渡す
168
+
169
+ adapter?.setSwitchListener{id:Long?,boolean:Boolean->
170
+
171
+ realm.executeTransaction {db: Realm->
172
+
173
+ var get_task : Task?
174
+
175
+ get_task = db.where<Task>().equalTo("id", id).findFirst()
176
+
177
+ get_task?.flg = boolean
178
+
179
+ }
180
+
181
+ }
182
+
183
+
184
+
185
+ //リストの削除ボタン
186
+
187
+ adapter?.setDelListener {id ->
188
+
189
+ realm.executeTransaction { db: Realm ->
190
+
191
+ db.where<Task>().equalTo("id", id)
192
+
193
+ .findFirst()
194
+
195
+ ?.deleteFromRealm()
196
+
197
+ db.where<subTask>().equalTo("mainId", id)
198
+
199
+ .findAll()
200
+
201
+ ?.deleteAllFromRealm()
202
+
203
+ }
204
+
205
+ adapter?.notifyDataSetChanged()
206
+
207
+ }
208
+
209
+ //Recyclerがスクロールされたら
210
+
211
+ /*task_list.addOnScrollListener(
212
+
213
+
214
+
215
+ )*/
216
+
217
+ }
218
+
219
+
220
+
221
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
222
+
223
+ // Inflate the menu; this adds items to the action bar if it is present.
224
+
225
+ menuInflater.inflate(R.menu.menu_main, menu)
226
+
227
+ return true
228
+
229
+ }
230
+
231
+
232
+
233
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
234
+
235
+ // Handle action bar item clicks here. The action bar will
236
+
237
+ // automatically handle clicks on the Home/Up button, so long
238
+
239
+ // as you specify a parent activity in AndroidManifest.xml.
240
+
241
+ return when (item.itemId) {
242
+
243
+ R.id.action_settings -> true
244
+
245
+ else -> super.onOptionsItemSelected(item)
246
+
247
+ }
248
+
249
+ }
250
+
251
+
252
+
253
+ override fun onDestroy() {
254
+
255
+ super.onDestroy()
256
+
257
+ realm.close()
258
+
259
+ }
260
+
261
+
262
+
263
+ //画面が一番上になればすべてのセルに更新をかける
264
+
265
+ override fun onRestart() {
266
+
267
+ super.onRestart()
268
+
269
+ //データ更新
270
+
271
+ adapter?.notifyDataSetChanged()
272
+
273
+ }
274
+
275
+
276
+
277
+
278
+
279
+ }
280
+
281
+
282
+
283
+ ```
284
+
285
+ ```adapter
286
+
287
+ class TaskAdapter(data: OrderedRealmCollection<Task>, val realm: Realm):
288
+
289
+ RealmRecyclerViewAdapter<Task, TaskAdapter.ViewHolder>(data, true){
290
+
291
+
292
+
293
+ private var listener:((Long?)-> Unit)? = null
294
+
295
+ private var delListener:((Long?)-> Unit)? = null
296
+
297
+ private var switchListener:((Long?,Boolean)-> Unit)? = null
298
+
299
+
300
+
301
+ fun setOnclickListener(listener: (Long?)-> Unit){
302
+
303
+ this.listener = listener
304
+
305
+ }
306
+
307
+
308
+
309
+ fun setSwitchListener(listener:(Long?,Boolean)->Unit){
310
+
311
+ this.switchListener = listener
312
+
313
+ }
314
+
315
+
316
+
317
+ fun setDelListener(listener: (Long?)-> Unit){
318
+
319
+ this.delListener = listener
320
+
321
+ }
322
+
323
+
324
+
325
+ init {
326
+
327
+ setHasStableIds(true)
328
+
329
+ }
330
+
331
+
332
+
333
+ //セルに使用するビューを決める
334
+
335
+ class ViewHolder(cell: View) : RecyclerView.ViewHolder(cell){
336
+
337
+ val date: TextView = cell.findViewById(R.id.monthText)
338
+
339
+ val title: TextView = cell.findViewById(R.id.textTask)
340
+
341
+ val time: TextView = cell.findViewById(R.id.timeText)
342
+
343
+ val switch: Switch = cell.findViewById(R.id.switch1)
344
+
345
+ val deleteImage: ImageView = cell.findViewById(R.id.taskDeleteImage)
346
+
347
+ }
348
+
349
+
350
+
351
+ //セルが必要になるたびに呼び出される
352
+
353
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TaskAdapter.ViewHolder {
354
+
355
+ val inflater = LayoutInflater.from(parent.context)
356
+
357
+ //セルにビューを適用
358
+
359
+ val view = inflater.inflate(R.layout.task_list, parent, false)
360
+
361
+
362
+
363
+ return ViewHolder(view)
364
+
365
+
366
+
367
+ }
368
+
369
+
370
+
371
+ //指定された位置にデータを表示する必要がある時、呼び出される
372
+
373
+ override fun onBindViewHolder(holder: TaskAdapter.ViewHolder, position: Int) {
374
+
375
+
376
+
377
+ //データを取得
378
+
379
+ val task: Task? = getItem(position)
380
+
381
+ //Viewに値をセット
382
+
383
+ holder.date.text = DateFormat.format("yyyy/MM/dd", task?.date)
384
+
385
+ //holder.date.setVisibility(View.VISIBLE)
386
+
387
+ holder.time.text = DateFormat.format("HH:mm", task?.date)
388
+
389
+ holder.switch.setOnCheckedChangeListener(null)
390
+
391
+ holder.title.text = task?.title
392
+
393
+
394
+
395
+ //タスクに色を設定
396
+
397
+ if(task?.backColor != null)
398
+
399
+ holder.title.setBackgroundColor(backPaint(task?.backColor))
400
+
401
+
402
+
403
+ if(task?.flg != null) {
404
+
405
+ holder.switch.isChecked = task?.flg
406
+
407
+ holder.title.text = fontDraw(task?.flg, holder.title)
408
+
409
+ if(task?.flg == true){
410
+
411
+ holder.deleteImage.visibility = View.VISIBLE
412
+
413
+ }else{
414
+
415
+ holder.deleteImage.visibility = View.GONE
416
+
417
+ }
418
+
419
+ }
420
+
421
+
422
+
423
+ //タスクがタップされた時
424
+
425
+ holder.title.setOnClickListener {
426
+
427
+ //メインでセットした関数を実行
428
+
429
+ listener?.invoke(task?.id)
430
+
431
+ }
432
+
433
+ //削除
434
+
435
+ holder.deleteImage.setOnClickListener {
436
+
437
+ delListener?.invoke(task?.id)
438
+
439
+ }
440
+
441
+
442
+
443
+
444
+
445
+ //前の項目があるなら
446
+
447
+ val prevTask: Task? = if (position > 0) getItem(position - 1) else null
448
+
449
+ val df = SimpleDateFormat("yyyy/MM/dd")
450
+
451
+ //日付が一致するなら日付を消してくっつける
452
+
453
+ if(prevTask != null && df.format(prevTask.date) == df.format(task?.date)){
454
+
455
+ holder.date.setVisibility(View.GONE);
456
+
457
+ }else {
458
+
459
+ holder.date.setVisibility(View.VISIBLE);
460
+
461
+ }
462
+
463
+
464
+
465
+ //swichビューが切り替わった時
466
+
467
+ holder.switch.setOnCheckedChangeListener { compoundButton, b ->
468
+
469
+ switchListener?.invoke(task?.id, holder.switch.isChecked)
470
+
471
+
472
+
473
+ }
474
+
475
+ }
476
+
477
+
478
+
479
+ override fun getItemId(position: Int): Long {
480
+
481
+ return getItem(position)?.id ?: 0
482
+
483
+ }
484
+
485
+
486
+
487
+ //タスクの背景に色を付与
488
+
489
+ private fun backPaint(color:Int): Int{
490
+
491
+ //タスクの初期化のと時か
492
+
493
+ if(color == 0){
494
+
495
+ return Color.parseColor("#00BFFF")
496
+
497
+ }else{
498
+
499
+ return color
500
+
501
+ }
502
+
503
+ }
504
+
505
+
506
+
507
+ //タスクが完了済みなら線を引く、そうでなければ線を消す
508
+
509
+ private fun fontDraw(flg:Boolean, font: TextView): String{
510
+
511
+
512
+
513
+ val paint = font.paint
514
+
515
+ if(flg) {
516
+
517
+ // なぜか再代入しなければ、取り消し線が引かれない
518
+
519
+ font.text = font.text
520
+
521
+ // 取り消し線を引く
522
+
523
+ paint.flags = font.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
524
+
525
+ // アンチエイリアスをオンにする
526
+
527
+ paint.isAntiAlias = true
528
+
529
+ }else{
530
+
531
+ font.text = font.text
532
+
533
+ paint.flags = font.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
534
+
535
+ }
536
+
537
+
538
+
539
+ return font.text.toString()
540
+
541
+ }
542
+
543
+
544
+
545
+ }
546
+
547
+ ```
548
+
549
+
550
+
551
+ ```Task
552
+
553
+ open class Task : RealmObject(){
554
+
555
+ @PrimaryKey
556
+
557
+ var id: Long = 0
558
+
559
+ var date: Date = Date()
560
+
561
+ var title: String = ""
562
+
563
+ var detail: String = ""
564
+
565
+ var flg: Boolean = false
566
+
567
+ var backColor: Int = 0
568
+
569
+ }
570
+
571
+ ```