温馨提示:本文翻译自stackoverflow.com,查看原文请点击:android - Kotlin SharedPreferences

android - Kotlin共享首选项

发布于 2020-03-27 11:12:13

我有一个ListView包含创建的项目

 val values = ArrayList<String>().toMutableList()
 val adapter = ArrayAdapter(this, R.layout.listview_text_color, values)

 adapter.add(title_editText.text!!.toString() + " - " + content_editText.text!!.toString())

我需要保存那些ListView项目,并在使用SharedPreferences(不是DB)重新打开应用程序时再次重新加载它们

这是我关于SP的实际代码:

fun saveData(values: Set<String>) {
    val sharedPref = this.getPreferences(Context.MODE_PRIVATE) ?: return
    with(sharedPref.edit()) {
        putStringSet("test", values)
        putString("title", title_editText.text!!.toString())
        putString("content", content_editText.text!!.toString())
        apply()
    }
}

fun getData() {
    val sharedPref = this.getPreferences(Context.MODE_PRIVATE) ?: return
    val titleData = sharedPref.getString("title", "")
    val contentData = sharedPref.getString("content", "")
    Toast.makeText(this, "$titleData $contentData", Toast.LENGTH_LONG).show()

}

编辑解决方案

经过整天的研究,我找到了解决方案:

在MainActivity.kt中,将ArrayList变量创建为全局变量:

    class MainActivity : AppCompatActivity() {

    private var values = ArrayList<String>()

    ... //the rest of your code
}

然后添加这两个功能:

 private fun saveData() {
    val sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE)
    val editor = sharedPreferences.edit()
    val gson = Gson()
    val json = gson.toJson(values)
    editor.putString("task list", json)
    editor.apply()
}

private fun loadData() {
    val sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE)
    val gson = Gson()
    val json = sharedPreferences.getString("task list", "")
    val type = object: TypeToken<ArrayList<String>>() {
    }.type

   if(json == null)
       values = ArrayList()
   else
      values = gson.fromJson(json, type)
}

values您的ArrayList 在哪里

要保存数据:

done_fab.setOnClickListener {

        values.add("put your string here")
        adapter.notifyDataSetChanged() //your array adapter
        saveData()
    }

要加载数据,只需在MainActivity中调用该函数:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        loadData()

         val adapter = ArrayAdapter(this, R.layout.listview_text_color, values) //your custom arrayAdapter for the listView

        ... //the rest of your code
}

查看更多

查看更多

提问者
Arfmann
被浏览
56
Arfmann 2019-07-08 05:23

经过整天的研究,我找到了解决方案:

在MainActivity.kt中,将ArrayList变量创建为全局变量:

    class MainActivity : AppCompatActivity() {

    private var values = ArrayList<String>()

    ... //the rest of your code
}

然后添加这两个功能:

 private fun saveData() {
    val sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE)
    val editor = sharedPreferences.edit()
    val gson = Gson()
    val json = gson.toJson(values)
    editor.putString("task list", json)
    editor.apply()
}

private fun loadData() {
    val sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE)
    val gson = Gson()
    val json = sharedPreferences.getString("task list", "")
    val type = object: TypeToken<ArrayList<String>>() {
    }.type

   if(json == null)
       values = ArrayList()
   else
      values = gson.fromJson(json, type)
}

values您的ArrayList 在哪里

要保存数据:

done_fab.setOnClickListener {

        values.add("put your string here")
        adapter.notifyDataSetChanged() //your array adapter
        saveData()
    }

要加载数据,只需在MainActivity中调用该函数:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        loadData()

         val adapter = ArrayAdapter(this, R.layout.listview_text_color, values) //your custom arrayAdapter for the listView

        ... //the rest of your code
}

所有这些都是因为SharedPreferences不支持ArrayList<String>存储,因此最好使用JSON传递它们

发布
问题

分享
好友

手机
浏览

扫码手机浏览