为共享首选项传递不同的值
Passing different values for Shared Preferences
我是一个没有经验的 Android 初学者!
所以我正在学习,在我的项目中,我必须使用 url 和 shared preferences (Volley)
来显示 Recycler View
中的项目。
所以类别将user_id
和api_key
作为参数,然后子类别将user_id
、cat_id
和 api_key
作为参数。
我使用 JSONObject 来解析类别,并尝试将 类别 ID 保存在 shared preferences
.
中
所以在 SubcategoryFragment
之后,我再次调用了 shared preferences
,它 运行。但我注意到对于所有类别项目,只有一个 id 用于子类别。所以基本上多个类别都在调用同一个子类别。
我认为这是因为在我的 SubcategoryFragment
代码中,我只调用了一次共享首选项的编辑器,而在 CategoryFragment 中,我将编辑器放在 JSON 数组的 for 循环中。
请告诉我您的想法。我很感激!
我保存 categoryID
的 CategoryFragment:
var catList = ArrayList<CategoryItem>()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
var view = inflater.inflate(R.layout.fragment_main_act, container, false)
//Recycler view
view.recyclerViewCat.layoutManager = LinearLayoutManager(context)
var sp: SharedPreferences = this.activity!!.getSharedPreferences("chamber", Context.MODE_PRIVATE)
var editor = sp.edit()
var iD = sp.getString("user_id", "Default")
var apiKey = sp.getString("user_apikey", "Default")
val url = "XXXX.php?cust_category.php?api_key=$apiKey&user_id=$iD"
var stringRequest = StringRequest(Request.Method.GET, url,
Response.Listener {
var jsonObject = JSONObject(it)
var jsonArrayCats =jsonObject.getJSONArray("category")
for(i in 0 until jsonArrayCats.length()){
var cats =jsonArrayCats.getJSONObject(i)
var cID = cats.getString("cid")
var cName = cats.getString("cname")
var cDes = cats.getString("cdiscription")
var cImg = cats.getString("cimagerl")
catList.add(CategoryItem(cID, cName, cDes, cImg))
editor.putString("cat_id", cID)
editor.putString("cat_name", cName)
editor.putString("cat_des", cDes)
editor.putString("cat_Img", cImg)
}
editor.apply()
val adapter = CatAdapter(catList, view.context)
view.recyclerViewCat.adapter = adapter
},
Response.ErrorListener {
Toast.makeText(view.context, "invalid api key or user id", Toast.LENGTH_SHORT).show()
}
)
Volley.newRequestQueue(view.context).add(stringRequest)
return view
}
我的 SubcategoryFragment
使用它:
var scatList = ArrayList<SubCategoryItem>()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
var view = inflater.inflate(R.layout.fragment_sub_category, container, false)
view.recyclerViewSubCat.layoutManager = LinearLayoutManager(context)
var sp: SharedPreferences = this.activity!!.getSharedPreferences("chamber", Context.MODE_PRIVATE)
var editor = sp.edit()
var catId = sp.getString("cat_id", "Default")
var apiKey = sp.getString("user_apikey", "Default")
var userId = sp.getString("user_id", "Default")
val url = "XXXXX.php?Id=$catId&api_key=$apiKey&user_id=$userId"
var stringReq = StringRequest(Request.Method.GET, url,
Response.Listener {
var jsonObject = JSONObject(it)
var jsonArraySCat = jsonObject.getJSONArray("subcategory")
for(i in 0 until jsonArraySCat.length()){
var scats = jsonArraySCat.getJSONObject(i)
var scID = scats.getString("scid")
var scName = scats.getString("scname")
var scDes = scats.getString("scdiscription")
var scImg = scats.getString("scimageurl")
editor.putString("scat_id", scID)
editor.putString("scat_name", scName)
editor.putString("scat_des", scDes)
editor.putString("scat_Img", scImg)
scatList.add(SubCategoryItem(scID, scName, scDes, scImg))
}
editor.commit()
val adapter = SubCatAdapter(scatList, view.context)
view.recyclerViewSubCat.adapter = adapter
},
Response.ErrorListener {
Log.e("ERROR", it.message.toString())
Toast.makeText(view.context, "No data", Toast.LENGTH_SHORT).show()
}
)
Volley.newRequestQueue(view.context).add(stringReq)
这是因为SharedPreferences
覆盖了具有相同键的值。
例如,您的 "chamber" SharedPreferences
-
中的键 "scid" 只有一个值
所以如果你这样做 -
for(i in 0 until jsonArraySCat.length()){
editor.putString("scat_id", scID)
}
键 "scat_id" 的值将在每次调用时被覆盖。
溶胶。 -
您可以将完整的 JSONObject
另存为 String
在您的 SharedPreferences
中,例如 -
editor.putString("jsonResponse", jsonObject.toString())
然后解析和重用它。
更新:
像这样更新您的代码 -
Response.Listener {
var stringReq = StringRequest(Request.Method.GET, url,
//Save in SharedPref
editor.putString("api_response", it)
editor.commit()
//Use a common parsing function
scatList = getParsedData(it) //it or from SharedPref
val adapter = SubCatAdapter(scatList, view.context)
view.recyclerViewSubCat.adapter = adapter
}
// 解析数据的常用函数
fun getParsedData(strResponse: String?): List<SubCategoryItem>{
if(!strResponse.isNullOrEmpty()){
try{
val list = ArrayList<SubCategoryItem>()
var jsonObject = JSONObject(it)
var jsonArraySCat = jsonObject.getJSONArray("subcategory")
repeat(jsonArraySCat.length()){ //use repeat than for loop
jsonArraySCat.getJSONObject(it).run{
SubCategoryItem(getString("scid"), scats.getString("scname"), scats.getString("scdiscription"), scats.getString("scimageurl")).also{
list.add(it)
}
}
}
return list //return parsed data list
}catch(e: JSONException){
Log.d(TAG, "Parse Exception $e")
}
}
return ArrayList() //return empty list
}
我是一个没有经验的 Android 初学者!
所以我正在学习,在我的项目中,我必须使用 url 和 shared preferences (Volley)
来显示 Recycler View
中的项目。
所以类别将user_id
和api_key
作为参数,然后子类别将user_id
、cat_id
和 api_key
作为参数。
我使用 JSONObject 来解析类别,并尝试将 类别 ID 保存在 shared preferences
.
所以在 SubcategoryFragment
之后,我再次调用了 shared preferences
,它 运行。但我注意到对于所有类别项目,只有一个 id 用于子类别。所以基本上多个类别都在调用同一个子类别。
我认为这是因为在我的 SubcategoryFragment
代码中,我只调用了一次共享首选项的编辑器,而在 CategoryFragment 中,我将编辑器放在 JSON 数组的 for 循环中。
请告诉我您的想法。我很感激!
我保存 categoryID
的 CategoryFragment:
var catList = ArrayList<CategoryItem>()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
var view = inflater.inflate(R.layout.fragment_main_act, container, false)
//Recycler view
view.recyclerViewCat.layoutManager = LinearLayoutManager(context)
var sp: SharedPreferences = this.activity!!.getSharedPreferences("chamber", Context.MODE_PRIVATE)
var editor = sp.edit()
var iD = sp.getString("user_id", "Default")
var apiKey = sp.getString("user_apikey", "Default")
val url = "XXXX.php?cust_category.php?api_key=$apiKey&user_id=$iD"
var stringRequest = StringRequest(Request.Method.GET, url,
Response.Listener {
var jsonObject = JSONObject(it)
var jsonArrayCats =jsonObject.getJSONArray("category")
for(i in 0 until jsonArrayCats.length()){
var cats =jsonArrayCats.getJSONObject(i)
var cID = cats.getString("cid")
var cName = cats.getString("cname")
var cDes = cats.getString("cdiscription")
var cImg = cats.getString("cimagerl")
catList.add(CategoryItem(cID, cName, cDes, cImg))
editor.putString("cat_id", cID)
editor.putString("cat_name", cName)
editor.putString("cat_des", cDes)
editor.putString("cat_Img", cImg)
}
editor.apply()
val adapter = CatAdapter(catList, view.context)
view.recyclerViewCat.adapter = adapter
},
Response.ErrorListener {
Toast.makeText(view.context, "invalid api key or user id", Toast.LENGTH_SHORT).show()
}
)
Volley.newRequestQueue(view.context).add(stringRequest)
return view
}
我的 SubcategoryFragment
使用它:
var scatList = ArrayList<SubCategoryItem>()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
var view = inflater.inflate(R.layout.fragment_sub_category, container, false)
view.recyclerViewSubCat.layoutManager = LinearLayoutManager(context)
var sp: SharedPreferences = this.activity!!.getSharedPreferences("chamber", Context.MODE_PRIVATE)
var editor = sp.edit()
var catId = sp.getString("cat_id", "Default")
var apiKey = sp.getString("user_apikey", "Default")
var userId = sp.getString("user_id", "Default")
val url = "XXXXX.php?Id=$catId&api_key=$apiKey&user_id=$userId"
var stringReq = StringRequest(Request.Method.GET, url,
Response.Listener {
var jsonObject = JSONObject(it)
var jsonArraySCat = jsonObject.getJSONArray("subcategory")
for(i in 0 until jsonArraySCat.length()){
var scats = jsonArraySCat.getJSONObject(i)
var scID = scats.getString("scid")
var scName = scats.getString("scname")
var scDes = scats.getString("scdiscription")
var scImg = scats.getString("scimageurl")
editor.putString("scat_id", scID)
editor.putString("scat_name", scName)
editor.putString("scat_des", scDes)
editor.putString("scat_Img", scImg)
scatList.add(SubCategoryItem(scID, scName, scDes, scImg))
}
editor.commit()
val adapter = SubCatAdapter(scatList, view.context)
view.recyclerViewSubCat.adapter = adapter
},
Response.ErrorListener {
Log.e("ERROR", it.message.toString())
Toast.makeText(view.context, "No data", Toast.LENGTH_SHORT).show()
}
)
Volley.newRequestQueue(view.context).add(stringReq)
这是因为SharedPreferences
覆盖了具有相同键的值。
例如,您的 "chamber" SharedPreferences
-
所以如果你这样做 -
for(i in 0 until jsonArraySCat.length()){
editor.putString("scat_id", scID)
}
键 "scat_id" 的值将在每次调用时被覆盖。
溶胶。 -
您可以将完整的 JSONObject
另存为 String
在您的 SharedPreferences
中,例如 -
editor.putString("jsonResponse", jsonObject.toString())
然后解析和重用它。
更新:
像这样更新您的代码 -
Response.Listener {
var stringReq = StringRequest(Request.Method.GET, url,
//Save in SharedPref
editor.putString("api_response", it)
editor.commit()
//Use a common parsing function
scatList = getParsedData(it) //it or from SharedPref
val adapter = SubCatAdapter(scatList, view.context)
view.recyclerViewSubCat.adapter = adapter
}
// 解析数据的常用函数
fun getParsedData(strResponse: String?): List<SubCategoryItem>{
if(!strResponse.isNullOrEmpty()){
try{
val list = ArrayList<SubCategoryItem>()
var jsonObject = JSONObject(it)
var jsonArraySCat = jsonObject.getJSONArray("subcategory")
repeat(jsonArraySCat.length()){ //use repeat than for loop
jsonArraySCat.getJSONObject(it).run{
SubCategoryItem(getString("scid"), scats.getString("scname"), scats.getString("scdiscription"), scats.getString("scimageurl")).also{
list.add(it)
}
}
}
return list //return parsed data list
}catch(e: JSONException){
Log.d(TAG, "Parse Exception $e")
}
}
return ArrayList() //return empty list
}