質問編集履歴

1 質問内容に関係のないDialogd.ktを消し、activity_main.xmlを追加しました

aNomoto

aNomoto score 4

2018/10/21 01:03  投稿

カレンダーダイアログで選択した日付を一件ごとのAdapterに反映させたい
### 前提・実現したいこと
プログラミング初心者で、不慣れな点が多く、質問の説明もわかりにくいと思いますが
解決策を教えていただけると助かります。
実現したいことは
フローティングアクションボタンを押すとlistViewにadapterが追加された後、
カレンダーダイアログが表示され、date_butto.textに選択した日付が代入される。
という処理です。
### 発生している問題
下記のコードでアプリを実行すると
1つめのアダプターには日付が代入されるのですが
2つめ以降のアダプターを作成しようとすると1つ目の日付が上書きされてしまい、2つ目は空欄のままになってしまいます。
また、スクロールをしても1つ目の日付が消えてしまいます。
![イメージ説明](54eaf790c299f98406c695dbd8d7fc8f.png)
### 該当のソースコード
```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)
       //初期のリスト項目を設定  
       val arrayAdapter = MyArrayAdapter(this, 0).apply{
           floatingActionButton.setOnClickListener {
               val dialog = DatePickerFragment()
               dialog.show(supportFragmentManager, "date_dialog")
               add(ListItem(""))
           }
       }
       //ListViewにリスト項目とArrayAdapterを設定  
       val listView: ListView = findViewById(R.id.listView)
       listView.adapter = arrayAdapter
   }
}
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" android:text="@string/date_button_text"/>
           <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>
```
```xml
//activity_main.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">
   <ListView
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           app:layout_constraintStart_toStartOf="parent"
           app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
           app:layout_constraintTop_toTopOf="parent" android:id="@+id/listView"
           app:layout_constraintHorizontal_bias="0.0" app:layout_constraintVertical_bias="1.0"/>
   <android.support.design.widget.FloatingActionButton
           android:layout_height="41dp"
           android:clickable="true" app:srcCompat="@drawable/ic_add_black_24dp"
           android:id="@+id/floatingActionButton"
           android:layout_marginBottom="8dp"
           app:layout_constraintBottom_toBottomOf="parent" android:layout_marginEnd="8dp"
           app:layout_constraintEnd_toEndOf="parent" android:layout_marginRight="8dp" android:layout_marginTop="8dp"
           app:layout_constraintTop_toTopOf="parent" android:layout_marginStart="8dp"
           app:layout_constraintStart_toStartOf="@+id/listView" android:layout_marginLeft="8dp"
           app:layout_constraintHorizontal_bias="0.911" app:layout_constraintVertical_bias="0.96"
           android:layout_width="41dp"/>
</android.support.constraint.ConstraintLayout>
```
### 試したこと
似たような処理について書かれている記事が見つからない。Buildも問題なくできている事から原因がわからず、手詰まり状態です。
### 補足情報(FW/ツールのバージョンなど)
Gradle version 4.6
AndroidStudio 3.2.1
  • Android Studio

    4301 questions

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

  • Kotlin

    606 questions

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

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