Отображение значения JSON в представлении Recycler с использованием Kotlin - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь отобразить элементы в нижней навигационной операции с использованием представления переработчика. Я могу отображать элементы, но не могу отобразить значения в операции в формате JSON.Я использую метод OKHTTP.Код работает до кода JSON.Я использую kotlin в своей разработке.

[{"name":"Test1","age":"10"},{"name":"Test2","location":"20"}]

У меня есть три макета в моем проекте activity_main.xml, list_row.xml и фрагмента_home.xml.Представление Recycler находится в frag_home.xml, а list_row.xml содержит два текстовых представления.

Ниже код работает нормально, но я не уверен, как добавить значение JSON в код для отображения.Я попробовал приведенный ниже код, и если у кого-то есть самый простой способ сделать это, то дайте мне знать.Любая помощь приветствуется.

HomeFragment.kt

class HomeFragment : Fragment() {

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


    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {
        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)

        }
        adapter!!.notifyDataSetChanged()
fetchJSON()
return view

    }

Код JSON:

    private fun fetchJSON()
    {
        val SchoolDetailUrl="https://www.abc.app/"
        println("School URL: $SchoolDetailUrl")
        val request= Request.Builder().url(SchoolsDetailUrl).build()
        val client= OkHttpClient()

        client.newCall(request).enqueue(object : Callback {
            override fun onResponse(call: Call, response: Response) {
                val body=response?.body()?.string()

                val gson=GsonBuilder().create()

                val Schoollist=gson.fromJson(body,Array<Person>::class.java)

             //       recyclerView.adapter=PersonDetailAdapter(Schoollist)

                println("Testing School Detail $body")
            }
            override fun onFailure(call: Call, e: IOException) {
                println("Failed to Execute the Request")
            }
        })
    }

}

PersonListAdapter:

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()
             }

         }

    }


}

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

В вашем коде есть некоторые проблемы, но главная из них - способ, которым ваш адаптер использует данные.

    personList=ArrayList<Person>()
    adapter= PersonListAdapter(personList,this.context!!)
    [...]
    adapter!!.notifyDataSetChanged()

Когда вы добавляете элементы в список:

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

То, что вы на самом деле делаете, это добавление в локальный список personList, а не в private val list: ArrayList<Person> вашего адаптера. Вот почему у вас нет данных для отображения.

Вместо этого вам следуетдобавьте методы, такие как add(person: Person), к вашему адаптеру, и позвольте ему добавить вместо него private val list.Храните данные в адаптере, а не в поле зрения;)

0 голосов
/ 13 декабря 2018

Итак, вам нужно вызывать API сведений о человеке для каждого клика на элементе человека.В настоящее время

PersonListAdapter(psersonList: ArrayList<Person>,context Context)

has 2 arguments change that to pass another argument the `fetchJson` Function itself

PersonListAdapter(context Context,psersonList: ArrayList<Person>, fetchJson: (string) -> Unit)

В выборке JSON я думаю, что другое представление отображается с личными данными, которые вы должны сделать,

ПРИМЕЧАНИЕ. Обычно контекст является первым аргументом, а также вФункция fetchJSON, если вы надуваете другое представление, содержащее подробности, затем измените имя функции на какое-то значение, полное, например ShowDetails()

...