package ドメイン.sharedpref2import android.content.Contextimport android.content.SharedPreferencesimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.view.Viewimport android.widget.Toastimport 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 val data = mutableSetOf<String>() for (score in scores) { // データを文字列にして Set<String> に add する data.add(score.toString()) } // SharedPref に保存する preferences.edit().putStringSet(PREF_SET_KEY, data).apply() Toast.makeText(this, "保存しました", Toast.LENGTH_SHORT).show() } private fun showData() { val scoresSet = preferences.getStringSet(PREF_SET_KEY, null) if (scoresSet != null) { val scores = mutableListOf<Score>() for (score in scoresSet) { scores.add(Score.fromString(score)) } listView.adapter = ScoreAdapter(this, scores) } } 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() }}package ドメイン.sharedpref2data class Score(val name: String, val score: Int) { companion object { /** * Score インスタンスを作成する FactoryMethod * @param score "NAME,SCORE" -> CSV 形式の文字列 */ fun fromString(score: String): Score { val array = score.split(",") return Score(array[0], array[1].toInt()) } } override fun toString(): String { return "$name,$score" }}package ドメイン.sharedpref2import 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 { val view = convertView ?: createView(parent) val item = getItem(position) (view.tag as ViewHolder).run { name.text = item.name item.score.toString() } return view } override fun getItem(position: Int) = scores[position] override fun getItemId(position: Int) = position.toLong() override fun getCount() = scores.size private fun createView(parent: ViewGroup?): View { val view = LayoutInflater.from(context).inflate( R.layout.list_item_row, parent, false ) view.tag = ViewHolder(view) return view } private 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" app:layout_constraintBottom_toBottomOf="parent" 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: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_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="John" /></androidx.constraintlayout.widget.ConstraintLayout>