【问题标题】:No Error in the Log but RecyclerView is not displaying any JSON value-No error in the code too---Volley日志中没有错误但 RecyclerView 没有显示任何 JSON 值-代码中也没有错误---Volley
【发布时间】:2018-12-16 07:56:32
【问题描述】:

我正在尝试在 HomeFragment 中显示 JSON 数组中的姓名和年龄。我有模型、数据和 UI 包。我在代码或日志中没有看到任何错误,但在我的活动中没有得到输出。我在响应日志中得到 JSON 输出,并且 Commented for 循环在 recyclerview 中工作,但如果我使用真正的 JSON 值,则片段不显示任何值。感谢您的帮助。

Home Fragment.kt
    class HomeFragment : Fragment() {

    private var adapter:PersonListAdapter?=null
    private var personList:ArrayList<Person>?=null
    private var layoutManager: RecyclerView.LayoutManager?=null


    var volleyRequest: RequestQueue?=null

    val SchoolLink="https://www.abc.app/"

//JSON Output
//[{"name":"AAA","age":"20"},{"name":"BBBB","age":"30"}]
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {
        volleyRequest= Volley.newRequestQueue(this.context)

    val view = inflater.inflate(R.layout.fragment_home, container, false)
        val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerView)
        personList=ArrayList<Person>()
        layoutManager= LinearLayoutManager(this.context)
        adapter= PersonListAdapter(personList,this.context!!)
        recyclerView.layoutManager=layoutManager
        recyclerView.adapter=adapter

        /*
        for (i in 0..16) {
            val person = Person()
            person.name="Hello" + i
            person.age = 20 + i
            personList!!.add(person)

        }*/


        val jsonArray=JsonArrayRequest(Request.Method.GET,SchoolLink,
                Response.Listener {
                    response: JSONArray ->

                    try {
                        Log.d("Response from JSON",response.toString())

                        for(i in 0..response.length()-1)
                        {
val person = Person()
                            val SchoolObj=response.getJSONObject(i)
                            var name=SchoolObj.getString("name")
person.name=name
                            Log.d("name from JSON",name)

                            var age:String=SchoolObj.getString("age")
person.age=age.toDouble()
                            Log.d("age from JSON",age)
personList!!.add(person)

                        }
 adapter!!.notifyDataSetChanged()
                    } catch (e:JSONException){e.printStackTrace()}
                },

                Response.ErrorListener {
                    error ->

                    try {
                        Log.d("Error",error.toString())
                    }
                    catch (e: JSONException){e.printStackTrace()}
                })

        volleyRequest!!.add(jsonArray)



return view
    }
    fun getJsonArray(Url:String)
    {

    }

}


PersonListAdapter.kt

class PersonListAdapter(private val list: ArrayList<Person>,
                        private val context: Context)
    : RecyclerView.Adapter<PersonListAdapter.ViewHolder>() {
    override fun getItemCount(): Int {
        return list.size

    }

    override fun onCreateViewHolder(parent: ViewGroup?, position: Int): ViewHolder {
                   val view = LayoutInflater.from(context).inflate(R.layout.list_row, parent, false)

        return ViewHolder(view)


    }

    override fun onBindViewHolder(holder: ViewHolder?, position: Int) {

        holder?.bindItem(list[position])


    }


     inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
         fun bindItem(person: Person) {
             var name: TextView = itemView.findViewById(R.id.name) as TextView
             var age: TextView = itemView.findViewById(R.id.age) as TextView

             name.text = person.name
             age.text = person.age.toString()



             itemView.setOnClickListener {


                 Toast.makeText(context, name.text, Toast.LENGTH_LONG ).show()
             }

         }

    }


}

【问题讨论】:

  • 你能发布json响应吗?
  • 嗨,Sandip,就像下面这样一个 //[{"name":"AAA","age":"20"},{"name":"BBBB","age":" 30",}]
  • //[{"name":"AAA","age":"20"},{"name":"BBBB","age":"30"}]
  • 两个日志都打印出来了:"Log.d("name from JSON",name) and Log.d("age from JSON",age)"??
  • 是的。它正在打印价值

标签: android android-studio kotlin android-volley kotlin-android-extensions


【解决方案1】:

在这部分:

                   for(i in 0..response.length()-1)
                    {
                        val SchoolObj=response.getJSONObject(i)
                        var name=SchoolObj.getString("name")
                        person.name=name
                        Log.d("name from JSON",name)

                        var age:String=SchoolObj.getString("age")
                        person.age=age.toDouble()
                        Log.d("age from JSON",age)

                    }

您没有在人员列表中添加人员对象。

                  for(i in 0..response.length()-1)
                    {
                        val person = Person()
                        val SchoolObj=response.getJSONObject(i)
                        var name=SchoolObj.getString("name")
                        person.name=name
                        Log.d("name from JSON",name)

                        var age:String=SchoolObj.getString("age")
                        person.age=age.toDouble()
                        Log.d("age from JSON",age)
                        personList!!.add(person)

                    }
                    adapter!!.notifyDataSetChanged()

希望这对你有帮助。

【讨论】:

  • 感谢桑迪普的帮助。我也更改了代码,一旦我在 for 循环下方添加了适配器,那么一切都按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2014-08-29
  • 1970-01-01
  • 2017-09-05
  • 2017-03-18
  • 2021-05-27
  • 1970-01-01
相关资源
最近更新 更多