Передача различных значений для общих настроек - PullRequest
0 голосов
/ 20 октября 2019

Я здесь неопытный ученик Android!

Итак, я учусь, и в моем проекте я должен использовать URL и shared preferences (Volley), чтобы показать элементы в Recycler View.

Таким образом, категории принимают user_id и api_key в качестве параметров, а после этого подкатегории принимают user_id, cat_id и api_key в качестве параметров. ,

Я использовал JSONObject для разбора категорий и попытался сохранить идентификаторы категорий в shared preferences.

Так что после этого в SubcategoryFragment я позвонилshared preferences снова, и он побежал. Но я заметил, что для всех элементов категории для подкатегорий использовался только один идентификатор. Таким образом, в основном несколько категорий называют одну и ту же подкатегорию.

Я думаю, потому что в своем коде SubcategoryFragment я вызывал редактор общих настроек только один раз, а в CategoryFragment я помещал редактор в цикл for для JSON Array.

Пожалуйста, дайте мне знать, что вы думаете. Я оцениваю это!

Мой CategoryFragment, который сохранил categoryID:


    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)

1 Ответ

1 голос
/ 20 октября 2019

Это потому, что SharedPreferences переопределяет значение с тем же ключом. Например, в вашей «камере» будет только одно значение ключа «scid» SharedPreferences -

Так что если вы сделаете что-то подобное -

for(i in 0 until jsonArraySCat.length()){
    editor.putString("scat_id", scID)
}

, чем значение для ключа »scat_id "будет переопределяться при каждом вызове.

Sol. - Вы можете сохранить полный 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
}
...