質問編集履歴

1 初心者タグをつけ忘れていたため追加しました。

aNomoto

aNomoto score 4

2018/10/19 23:58  投稿

ボタンを押して日付を反映させたカードをlistViewに追加したい
### 前提・実現したいこと
初めて自主製作アプリを開発しているものです。
食事記録アプリ?のようなものが作りたくて
以下のような処理を実現させたいです。
```
floating Action Buttonを押す。
カレンダーのダイアログが表示される。
list_item.xmlの内容がlistViewに出力される。このときダイアログで選択した日付がdate_button.textに代入されている。
```
### 発生している問題
ネットのサンプルコードや本を頼りにコーディングを行ったのですが、
以下のような処理になってしまいます。
```
floating Action Buttonを押す。
add(ListItem(""))の数だけlist_item.xmlの内容が一度に出力される。
カレンダーのダイアログが表示される。
ダイアログで選択した日付が一番上のカードにだけ反映される。
```
### 該当のソースコード
```kotlin
//MainActivity.kt
package com.example.promoto.proc
import android.content.Context
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.text.format.DateFormat
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageButton
import android.widget.ListView
import android.widget.TextView
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.list_item.*
import java.util.*
class MainActivity : AppCompatActivity() ,DatePickerFragment.OnDateSelectedListener {
override fun onSelected(year: Int, month: Int, date: Int) {
val c = Calendar.getInstance()
c.set(year, month, date)
date_button.text = DateFormat.format("MM/dd", c)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
floatingActionButton.setOnClickListener {
//初期のリスト項目を設定
val arrayAdapter = MyArrayAdapter(this, 0).apply{
add(ListItem(""))
}
//ListViewにリスト項目とArrayAdapterを設定
val listView: ListView = findViewById(R.id.listView)
listView.adapter = arrayAdapter
val dialog = DatePickerFragment()
dialog.show(supportFragmentManager, "date_dialog")
}
}
}
class ListItem(val date_data : String){}
//リスト項目を再利用するためのホルダー
data class ViewHolder(val date_dataView: TextView,val morningIcon:ImageButton,val lunchIcon:ImageButton,val dinnerIcon:ImageButton)
//自作のリスト項目データを扱えるようにしたArrayAdapter
class MyArrayAdapter : ArrayAdapter<ListItem> {
private var inflater : LayoutInflater? = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)as LayoutInflater?
constructor(context: Context,resource :Int):super(context,resource){}
override fun getView(position:Int, convertView: View?, parent: ViewGroup?):View{
var viewHolder : ViewHolder? = null
var view = convertView
//再利用の設定
if(view == null){
view = inflater!!.inflate(R.layout.list_item,parent,false)
viewHolder = ViewHolder(
view.findViewById(R.id.date_button),
view.findViewById(R.id.morning_button),
view.findViewById(R.id.lunch_button),
view.findViewById(R.id.dinner_button)
)
view.tag = viewHolder
}else{
viewHolder = view.tag as ViewHolder
}
//項目の情報設定
val listItem = getItem(position)
viewHolder.date_dataView.text =listItem!!.date_data
viewHolder.morningIcon.setOnClickListener{
//削除ボタンを押したときの処理
this.remove(listItem)
this.notifyDataSetChanged()
}
return view!!
}
}
```
```kotlin
//Dialogs.kt
package com.example.promoto.proc
import android.app.DatePickerDialog
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.support.v4.app.DialogFragment
import android.widget.DatePicker
import java.util.*
class DatePickerFragment : DialogFragment(),
DatePickerDialog.OnDateSetListener{
interface OnDateSelectedListener{
fun onSelected(year: Int,month: Int,date: Int)
}
private lateinit var listener: OnDateSelectedListener
override fun onAttach(context: Context?){
super.onAttach(context)
if(context is OnDateSelectedListener){
listener = context
}
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val c = Calendar.getInstance()
val year = c.get(Calendar.YEAR)
val month = c.get(Calendar.MONTH)
val date =c.get(Calendar.DAY_OF_MONTH)
return DatePickerDialog(context,this,year,month,date)
}
override fun onDateSet(view: DatePicker,year:Int,month: Int,date: Int) {
listener.onSelected(year,month,date) //To change body of created functions use File | Settings | File Templates.
}
}
```
```xml
//list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="135dp"
card_view:cardCornerRadius="4dp"
android:id="@+id/cardView"
tools:layout_editor_absoluteX="31dp"
card_view:layout_constraintTop_toTopOf="parent"
card_view:layout_constraintBottom_toBottomOf="parent">
<!-- カードに載せる情報 -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:id="@+id/cardRelative"
>
<Button
android:layout_width="65dp"
android:layout_height="match_parent"
android:textAllCaps="false" android:layout_alignParentStart="true"
android:layout_alignParentTop="true" android:layout_marginTop="0dp"
android:layout_marginStart="2dp" android:layout_alignParentBottom="true"
android:layout_marginBottom="0dp" android:textStyle="italic"
android:layout_toStartOf="@+id/morning_button" android:layout_marginRight="0dp"
android:layout_marginEnd="0dp" android:layout_toLeftOf="@+id/morning_button"
android:id="@+id/date_button"/>
<ImageButton
android:layout_width="100dp"
android:layout_height="match_parent" app:srcCompat="@drawable/morning_icon"
android:id="@+id/morning_button"
android:layout_alignParentTop="true"
android:layout_marginTop="0dp" android:layout_alignParentBottom="true"
android:layout_marginBottom="0dp"
android:layout_toStartOf="@+id/lunch_button" android:layout_marginRight="2dp"
android:layout_marginEnd="2dp" android:layout_toLeftOf="@+id/lunch_button"/>
<ImageButton
android:layout_width="100dp"
android:layout_height="wrap_content" app:srcCompat="@drawable/lunch_icon"
android:id="@+id/lunch_button"
android:layout_alignParentTop="true" android:layout_marginTop="0dp"
android:layout_alignParentBottom="true" android:layout_marginBottom="0dp"
android:layout_toStartOf="@+id/dinner_button" android:layout_marginRight="2dp"
android:layout_marginEnd="2dp" android:layout_toLeftOf="@+id/dinner_button"/>
<ImageButton
android:layout_width="100dp"
android:layout_height="wrap_content" app:srcCompat="@drawable/dinner_icon"
android:id="@+id/dinner_button"
android:layout_alignParentTop="true" android:layout_marginTop="0dp"
android:layout_alignParentBottom="true"
android:layout_marginBottom="0dp"
android:layout_alignParentEnd="true" android:layout_alignParentRight="true"
android:layout_marginRight="5dp" android:layout_marginEnd="5dp"/>
</RelativeLayout>
</android.support.v7.widget.CardView>
</android.support.constraint.ConstraintLayout>
```
### 試したこと
似たような処理について書かれている記事が見つからない。Buildも問題なくできている事から原因がわからず、手詰まり状態です。
### 補足情報(FW/ツールのバージョンなど)
Gradle version 4.6
AndroidStudio 3.2.1
プログラミング初心者で、不慣れな点が多く、質問の説明もわかりにくいと思いますが
回答よろしくお願いします。
  • Android Studio

    4300 questions

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

  • Kotlin

    606 questions

    Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る