package ドメイン.sharedprefjsonimport android.content.Contextimport android.content.SharedPreferencesimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.view.Viewimport android.widget.Toastimport com.google.gson.Gsonimport com.google.gson.reflect.TypeTokenimport kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() { companion object { const val PREF_FILE_NAME = "record" const val PREF_SET_KEY = "scores" } private lateinit var preferences: SharedPreferences private val initBtnListener = View.OnClickListener { val scores = listOf( Score("Geri", 71), Score("Enoch", 82), Score("Pamela", 62), Score("Cornelius", 100), Score("Joanna", 59) ) listView.adapter = ScoreAdapter(this, scores) } private val saveBtnListener = View.OnClickListener { val adapter = listView.adapter as ScoreAdapter val scores = adapter.scores // *** scores: List<Score> を JSON に変換 *** // Gson Instance 生成して、toJson() を呼んで Json を作成する// val json = Gson().toJson(scores) val json = scores.toJson() // SharedPreferences に保存する preferences.edit().putString(PREF_SET_KEY, json).apply() Toast.makeText(applicationContext, "保存しました", Toast.LENGTH_SHORT).show() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) preferences = getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE) btnInit.setOnClickListener(initBtnListener) btnSave.setOnClickListener(saveBtnListener) // SharedPreferences から読み込んでデータを表示させる showData() } private fun showData() { val data = preferences.getString(PREF_SET_KEY, null) if (data != null) {// val type = object : TypeToken<List<Score>>() {}.type// val scores = Gson().fromJson<List<Score>>(data, type)//// listView.adapter = ScoreAdapter(this, scores) listView.adapter = ScoreAdapter(this, data.fromJson()) } }}package ドメイン.sharedprefjsonimport com.google.gson.Gsonimport com.google.gson.reflect.TypeTokendata class Score(val name: String, val score: Int)fun List<Score>.toJson(): String = Gson().toJson(this)fun String.fromJson(): List<Score> = Gson().fromJson<List<Score>>(this, object : TypeToken<List<Score>>() {}.type)package ドメイン.sharedprefjsonimport android.content.Contextimport android.view.LayoutInflaterimport android.view.Viewimport android.view.ViewGroupimport android.widget.BaseAdapterimport android.widget.TextViewclass ScoreAdapter( private val context: Context, val scores: List<Score>) : BaseAdapter() { override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View = (convertView ?: createView(parent)).apply { val item = getItem(position) (tag as ViewHolder).run { name.text = item.name score.text = item.score.toString() } } override fun getItem(position: Int) = scores[position] override fun getItemId(position: Int) = position.toLong() override fun getCount() = scores.size private fun createView(parent: ViewGroup?) = LayoutInflater.from(context).inflate(R.layout.list_item_row, parent, false).apply { tag = ViewHolder(this) } class ViewHolder(view: View) { val name: TextView = view.findViewById(R.id.txtName) val score: TextView = view.findViewById(R.id.txtScore) }}<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ListView android:id="@+id/listView" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginBottom="8dp" app:layout_constraintBottom_toTopOf="@+id/btnInit" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:listitem="@layout/list_item_row" /> <Button android:id="@+id/btnInit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:text="初期化" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/btnSave" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/btnSave" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存" app:layout_constraintBaseline_toBaselineOf="@+id/btnInit" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/btnInit" /></androidx.constraintlayout.widget.ConstraintLayout><?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/txtScore" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:layout_marginEnd="8dp" android:layout_marginBottom="16dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="100" /> <TextView android:id="@+id/txtName" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="16dp" android:layout_marginEnd="8dp" android:layout_marginBottom="16dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/txtScore" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="John" /></androidx.constraintlayout.widget.ConstraintLayout>apply plugin: 'com.android.application'apply plugin: 'kotlin-android'apply plugin: 'kotlin-android-extensions'android { …… 省略 ……}dependencies { …… 省略 …… def gson_version = "2.8.6" implementation "com.google.code.gson:gson:$gson_version"}