【发布时间】:2021-09-28 05:02:08
【问题描述】:
我正在努力找出我的代码出了什么问题。我正在使用 RecyclerView 和 SharedPreferences 的组合来创建一个简单的购物清单。这个想法是首先输入购物清单的名称,当用户单击该添加列表的名称(选择它)时,将打开一个新活动,并传递该对象(通过 serializableExtra 检索),您将能够将购物项目添加到该特定对象的列表中。
在我保存购物清单对象列表的主要活动中,SharedPreferences 完美运行(与 gson 一起),但是,当我尝试在第二个活动中为购物项目列表复制该内容时,我的应用程序崩溃.当我的构建日志内存不足时,它似乎进入了一个循环。
我已经调试了代码,问题发生在函数 saveData() 上,否则运行良好。任何帮助将不胜感激。
fun saveData (){
var sharedPreferences: SharedPreferences = getSharedPreferences("Liste_u_objektu", MODE_PRIVATE)
var editor: SharedPreferences.Editor = sharedPreferences.edit()
var gson = Gson()
var json: String = gson.toJson(listSource)
editor.putString("Spremi_Objekt", json)
editor.apply()
}
SingleListActivity.kt
package com.example.simpleshoppinglist
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.RecyclerView
import com.example.simpleshoppinglist.adapter.ShoppingItemAdapter
import com.example.simpleshoppinglist.model.ShoppingItem
import com.example.simpleshoppinglist.model.SingleLista
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
val activityIntentId: Int = 1
class SingleListActivity : AppCompatActivity() {
//Empty init
var singleList = SingleLista ("Placeholder")
var listSource = singleList.listOfShoppingItems
var shoppingItemAdapter = ShoppingItemAdapter(this, listSource)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_single_list)
val getObjectFromRecyclerOnClick = intent.getSerializableExtra("Extra_object") as SingleLista
singleList = getObjectFromRecyclerOnClick
listSource = singleList.listOfShoppingItems
loadData()
shoppingItemAdapter = ShoppingItemAdapter(this, listSource)
var recyclerViewSingle = findViewById<RecyclerView>(R.id.recycler_view_single)
val btnAddShoppingItem: Button = findViewById(R.id.btnDodajNamirnicu)
recyclerViewSingle.adapter = shoppingItemAdapter
btnAddShoppingItem.setOnClickListener {
val intent = Intent(this, AddShoppingItemActivity::class.java)
intent.putExtra("SinglLista", singleList)
this.startActivityForResult(intent, activityIntentId)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == activityIntentId) {
if (resultCode == RESULT_OK) {
//var testniLabel: TextView = findViewById(R.id.TESTNILABEL)
//testniLabel.text = "TEST LABEL"
var shoppingItemName = data?.getSerializableExtra("NazivNamirnice") as String
var shoppingItemQuantity = data?.getSerializableExtra("KolicinaNamirnice") as String
addShoppingItem(
shoppingItemName,
shoppingItemQuantity,
shoppingItemAdapter,
)
saveData()
}
}
}
fun saveData (){
var sharedPreferences: SharedPreferences = getSharedPreferences("Liste_u_objektu", MODE_PRIVATE)
var editor: SharedPreferences.Editor = sharedPreferences.edit()
var gson = Gson()
var json: String = gson.toJson(listSource)
editor.putString("Spremi_Objekt", json)
editor.apply()
}
fun loadData(){
var sharedPreferences: SharedPreferences = getSharedPreferences("Liste_u_objektu", MODE_PRIVATE)
var gson = Gson()
if (sharedPreferences.getString("Spremi_Objekt", null) != null){
var json: String = sharedPreferences.getString("Spremi_Objekt", null)!!
val turnsType = object : TypeToken<MutableList<ShoppingItem>>() {}.type
listSource = gson.fromJson(json,turnsType)
}
else{
listSource.clear()
}
}
fun addShoppingItem(
shoppingItemName: String,
shoppingItemQuantity: String,
adapter: ShoppingItemAdapter,
) {
listSource.add(ShoppingItem(
shoppingItemName,
shoppingItemQuantity.toInt(),
singleList
))
adapter.notifyDataSetChanged()
}
}
AddShoppingItemActivity.kt
package com.example.simpleshoppinglist
import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
class AddShoppingItemActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_dodaj_namirnicu)
val shoppingItemName: EditText = findViewById(R.id.nazivNamirniceEditText)
val shoppingItemQuantity: EditText = findViewById(R.id.kolicinaNamirniceEditText)
val btnAddShoppingItem: Button = findViewById(R.id.btnSpremiNamirnicu)
btnAddShoppingItem.setOnClickListener {
val intent = Intent(this, SingleListActivity::class.java)
intent.putExtra("NazivNamirnice",shoppingItemName.text.toString())
intent.putExtra("KolicinaNamirnice",shoppingItemQuantity.text.toString())
setResult(Activity.RESULT_OK,intent)
finish()
}
}
}
【问题讨论】:
标签: android kotlin android-recyclerview sharedpreferences