回答編集履歴

3 記述ミスの修正

shal0ne

shal0ne score 45

2018/11/02 01:14  投稿

回答ついてないので一応解決策のアイデアだけでも。
ソースコードを補完してAndroidStudioで最初の状態を再現しようと試みましたが動かなかったので、実際にコードを直して、エミュレータで動かして確認した訳ではないことを断っておきます。
```kotlin
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)
   }
```
のdate_buttonにはおそらく一番最初に作ったviewHolderのものがずっと保存されています。
なので2つ目を作っても、onSelectedが呼ばれた際には最初のviewHolderのdate_buttonに日付が反映されます。
```kotlin
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")
       }
   }
```
このFABの処理だと、
FABを押してDialog表示
->(Dialogがキャンセルされたかどうかに関わらず)AdapterにListItem("")を追加
->onSelectedで一番最初に作ったdate_buttonに日付を反映
->最初に作ったdate_button.textにはDialogで選択した日付が入り、二つ目にdate_button.textには""がそのまま入った状態で表示
の流れになっていると思います。
```kotlin
override fun onSelected(year: Int, month: Int, date: Int) {
       val c = Calendar.getInstance()
       c.set(year, month, date)
       //Dialogで選択したセットしたい日付を文字列にしてstrに代入
       //(そのままだと型がCharSequenceで、ListItemのString型のプロパティに代入できないので、as Stringでキャスト)
       val str=DateFormat.format("MM/dd", c) as String
       //ここに移動
       //初期のリスト項目を設定
       val arrayAdapter = MyArrayAdapter(this, 0).apply{
           add(ListItem(str))//空の文字列""の代わりに先ほどの文字列を使用
       }
       //ListViewにリスト項目とArrayAdapterを設定
       val listView: ListView = findViewById(R.id.listView)
       listView.adapter = arrayAdapter
       //消す
       //date_button.text = DateFormat.format("MM/dd", c)
   }
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main)
       val floatingActionButton=findViewById<FloatingActionButton>(R.id.fab)
       floatingActionButton.setOnClickListener {
           //onSelectedの方に移動
           /*//初期のリスト項目を設定
           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")
       }
   }
```
なので上記のように変更することで処理を
FABを押してDialog表示
->Dialogで日付を選択すれば変数strに日付のフォーマットをString型で保存(選択しなければ全てキャンセル)
->AdapterにListItem(str)を追加
->Adapterを適用し、最初に作ったものと、二つ目に作った、文字列strがdate_button.textに適用されたものが表示
という処理の流れになると思うのでうまくいくと思います。
色々間違っているところもあると思いますが、参考までに。
###11/1追記
上記の書き方だとadapterが初期化されてしまっていそうなので、応急手当として次のことをしてもらえればいいと思います。
```kotlin
class MainActivity : AppCompatActivity() ,DatePickerFragment.OnDateSelectedListener {
   //MainActivityのメンバとして追加
   val arrayAdapter=MyArrayAdapter(this, 0)
   lateinit var arrayAdapter:MyArrayAdapter
   override fun onCreate(savedInstanceState: Bundle?) {  
       super.onCreate(savedInstanceState)  
       setContentView(R.layout.activity_main)  
 
       //ここで初期化  
       arrayAdapter=MyArrayAdapter(this, 0)  
       ...  
   }  
   override fun onSelected(year: Int, month: Int, date: Int) {
       val c = Calendar.getInstance()
       c.set(year, month, date)
       val str=DateFormat.format("MM/dd", c) as String
       //メンバにMyArrayAdapterを保持しているので、その中にListItemを付け足す処理を書く
       arrayAdapter.apply{
           add(ListItem((str)))
       }
       //消す
       /*val arrayAdapter = MyArrayAdapter(this, 0).apply{
           add(ListItem(str))
       }*/
       val listView: ListView = findViewById(R.id.listView)
       listView.adapter = arrayAdapter
   }
   ...
}
```
2 回答の追記

shal0ne

shal0ne score 45

2018/11/01 18:21  投稿

回答ついてないので一応解決策のアイデアだけでも。
ソースコードを補完してAndroidStudioで最初の状態を再現しようと試みましたが動かなかったので、実際にコードを直して、エミュレータで動かして確認した訳ではないことを断っておきます。
```kotlin
 
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)
   }
```
のdate_buttonにはおそらく一番最初に作ったviewHolderのものがずっと保存されています。
なので2つ目を作っても、onSelectedが呼ばれた際には最初のviewHolderのdate_buttonに日付が反映されます。
```kotlin
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")
       }
   }
```
このFABの処理だと、
FABを押してDialog表示
->(Dialogがキャンセルされたかどうかに関わらず)AdapterにListItem("")を追加
->onSelectedで一番最初に作ったdate_buttonに日付を反映
->最初に作ったdate_button.textにはDialogで選択した日付が入り、二つ目にdate_button.textには""がそのまま入った状態で表示
の流れになっていると思います。
```kotlin
override fun onSelected(year: Int, month: Int, date: Int) {
       val c = Calendar.getInstance()
       c.set(year, month, date)
       //Dialogで選択したセットしたい日付を文字列にしてstrに代入
       //(そのままだと型がCharSequenceで、ListItemのString型のプロパティに代入できないので、as Stringでキャスト)
       val str=DateFormat.format("MM/dd", c) as String
       //ここに移動
       //初期のリスト項目を設定
       val arrayAdapter = MyArrayAdapter(this, 0).apply{
           add(ListItem(str))//空の文字列""の代わりに先ほどの文字列を使用
       }
       //ListViewにリスト項目とArrayAdapterを設定
       val listView: ListView = findViewById(R.id.listView)
       listView.adapter = arrayAdapter
       //消す
       //date_button.text = DateFormat.format("MM/dd", c)
   }
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main)
       val floatingActionButton=findViewById<FloatingActionButton>(R.id.fab)
       floatingActionButton.setOnClickListener {
           //onSelectedの方に移動
           /*//初期のリスト項目を設定
           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")
       }
   }
```
なので上記のように変更することで処理を
FABを押してDialog表示
->Dialogで日付を選択すれば変数strに日付のフォーマットをString型で保存(選択しなければ全てキャンセル)
->AdapterにListItem(str)を追加
->Adapterを適用し、最初に作ったものと、二つ目に作った、文字列strがdate_button.textに適用されたものが表示
という処理の流れになると思うのでうまくいくと思います。
色々間違っているところもあると思いますが、参考までに。
色々間違っているところもあると思いますが、参考までに。
###11/1追記
上記の書き方だとadapterが初期化されてしまっていそうなので、応急手当として次のことをしてもらえればいいと思います。
```kotlin
class MainActivity : AppCompatActivity() ,DatePickerFragment.OnDateSelectedListener {
   //MainActivityのメンバとして追加
   val arrayAdapter=MyArrayAdapter(this, 0)
   override fun onSelected(year: Int, month: Int, date: Int) {
       val c = Calendar.getInstance()
       c.set(year, month, date)
       val str=DateFormat.format("MM/dd", c) as String
       //メンバにMyArrayAdapterを保持しているので、その中にListItemを付け足す処理を書く
       arrayAdapter.apply{
           add(ListItem((str)))
       }
       //消す
       /*val arrayAdapter = MyArrayAdapter(this, 0).apply{
           add(ListItem(str))
       }*/
       val listView: ListView = findViewById(R.id.listView)
       listView.adapter = arrayAdapter
   }
   ...
}
```
1 書式の修正

shal0ne

shal0ne score 45

2018/10/27 12:11  投稿

回答ついてないので一応解決策のアイデアだけでも。
ソースコードを補完してAndroidStudioで最初の状態を再現しようと試みましたが動かなかったので、実際にコードを直して、エミュレータで動かして確認した訳ではないことを断っておきます。
```kotlin
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)
   }
```
のdate_buttonにはおそらく一番最初に作ったviewHolderのものがずっと保存されています。
なので2つ目を作っても、onSelectedが呼ばれた際には最初のviewHolderのdate_buttonに日付が反映されます。
```kotlin
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")
       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")  
       }
       val listView: ListView = findViewById(R.id.listView)  
       listView.adapter = arrayAdapter  
 
   }
```
このFABの処理だと、
FABを押してDialog表示
->(Dialogがキャンセルされたかどうかに関わらず)AdapterにListItem("")を追加
->onSelectedで一番最初に作ったdate_buttonに日付を反映
->最初に作ったdate_button.textにはDialogで選択した日付が入り、二つ目にdate_button.textには""がそのまま入った状態で表示
の流れになっていると思います。
```kotlin
override fun onSelected(year: Int, month: Int, date: Int) {
       val c = Calendar.getInstance()
       c.set(year, month, date)
       //Dialogで選択したセットしたい日付を文字列にしてstrに代入
       //(そのままだと型がCharSequenceで、ListItemのString型のプロパティに代入できないので、as Stringでキャスト)
       val str=DateFormat.format("MM/dd", c) as String
       //ここに移動
       //初期のリスト項目を設定
       val arrayAdapter = MyArrayAdapter(this, 0).apply{
           add(ListItem(str))//空の文字列""の代わりに先ほどの文字列を使用
       }
       //ListViewにリスト項目とArrayAdapterを設定
       val listView: ListView = findViewById(R.id.listView)
       listView.adapter = arrayAdapter
       //消す
       //date_button.text = DateFormat.format("MM/dd", c)
   }
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main)
       val floatingActionButton=findViewById<FloatingActionButton>(R.id.fab)
       floatingActionButton.setOnClickListener {
           //onSelectedの方に移動
           /*//初期のリスト項目を設定
           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")
       }
   }
```
なので上記のように変更することで処理を
FABを押してDialog表示
->Dialogで日付を選択すれば変数strに日付のフォーマットをString型で保存(選択しなければ全てキャンセル)
->AdapterにListItem(str)を追加
->Adapterを適用し、最初に作ったものと、二つ目に作った、文字列strがdate_button.textに適用されたものが表示
という処理の流れになると思うのでうまくいくと思います。
色々間違っているところもあると思いますが、参考までに。

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