RecyclerView отображает нулевое значение, но без ошибок в журнале - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь отобразить список, используя представление переработчика, но получаю значение null.У меня есть три класса Test, TestModel и TestListAdapter.Ниже мой вывод Json.Я получаю ошибку в одном месте.

val catObj = response.getJSONObject(i).

Если я упомяну i как int, то получаю сообщение об ошибке, поэтому мне нужно ввести i.toString() для преобразования строки.Даже после преобразования i в строку я не получаю вывод и никаких ошибок в журнале ошибок.Я использую Volley и Kotlin в своем коде.Любая помощь приветствуется.

Error:--Type Mismatch

 val catObj = response.getJSONObject(i)

Выход Json:

[{"id":"1","name":"AAAA"},{"id":"3","name":"BBBB"}]

Тестовый класс:

class Test : AppCompatActivity() {

var volleyRequest:RequestQueue?=null
var TestList: ArrayList<TestModel>?=null
var adapter:TestListAdapter?=null
var layoutManager: RecyclerView.LayoutManager?=null
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_Test)


 var HelloLink="https://www.abc.app"
 TestList= ArrayList<TestModel>()
 volleyRequest = Volley.newRequestQueue(this)

    getTest(HelloLink)
}

fun getTest(url: String) {

    print("Url Value is:"+url)
    val catRequest = JsonObjectRequest(Request.Method.GET,
            url, Response.Listener {
        response: JSONObject ->
        try {
            for (i in 0..response.length() - 1) {
                val Test=TestModel()
                val catObj = response.getJSONObject(i)

                var name = catObj.getString("name")

                Test.name = name
                Log.d("Name Result==>>", name)
                TestList!!.add(Test)
                adapter = TestListAdapter(TestList!!, this)
                layoutManager = LinearLayoutManager(this)
                recyclerViewTest.layoutManager = layoutManager
                recyclerViewTest.adapter = adapter
            }

            adapter!!.notifyDataSetChanged()


        }catch (e: JSONException) { e.printStackTrace()}

    },
            Response.ErrorListener {
                error: VolleyError? ->
                try {
                    Log.d("Error:", error.toString())

                }catch (e: JSONException){e.printStackTrace()}
            })
    volleyRequest!!.add(catRequest)
}

}

TestListAdapter Class

    class TestListAdapter(private val list:ArrayList<TestModel>,
                              private val context: Context):RecyclerView.Adapter<TestListAdapter.ViewHolder>()

    {
        override fun getItemCount(): Int {
            return list.size
        }

        override fun onCreateViewHolder(p0: ViewGroup, p1: Int): ViewHolder {

            val view 

=LayoutInflater.from(context).inflate(R.layout.list_Test,p0,false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(p0: ViewHolder, p1: Int) {

        p0?.bindItem(list[p1])
    }


    class ViewHolder(itemView:View):RecyclerView.ViewHolder(itemView) {

        fun bindItem(Test:TestModel)
        {
            var name:TextView=itemView.findViewById<TextView>(R.id.CatName)
            name.text=Test.name

        }
    }
}

Модель класса

class TestModel
{
    var id:Int?=null
    var name:String?=null

}

Ответы [ 2 ]

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

Как я уже упоминал в своем комментарии - я не настолько знаком с языком котлина, но пример JSON, который вы опубликовали:

[{"id": "1", "name": "AAAA"}, {"id": "3", "name": "BBBB"}]

на самом деле JSONArray, а не JSONObject, поэтому я думаю, что коддолжно выглядеть следующим образом:

fun getTest(url: String) {

    print("Url Value is:"+url)
    val catRequest = JsonArrayRequest(Request.Method.GET,
            url, Response.Listener {
        response: JSONArray ->
        try {
            for (i in 0..response.length() - 1) {
                val Test=TestModel()
                val catObj = response.getJSONObject(i)

                var name = catObj.getString("name")

                Test.name = name
                Log.d("Name Result==>>", name)
                TestList!!.add(Test)
                adapter = TestListAdapter(TestList!!, this)
                layoutManager = LinearLayoutManager(this)
                recyclerViewTest.layoutManager = layoutManager
                recyclerViewTest.adapter = adapter
            }

            adapter!!.notifyDataSetChanged()


        }catch (e: JSONException) { e.printStackTrace()}

    },
            Response.ErrorListener {
                error: VolleyError? ->
                try {
                    Log.d("Error:", error.toString())

                }catch (e: JSONException){e.printStackTrace()}
            })
    volleyRequest!!.add(catRequest)
}



Обратите внимание, что JsonArrayRequest находится вместо JsonObjectRequest, и ответJSONArray вместо JSONObject.

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

У вас возникли проблемы при добавлении данных в адаптер,

Обновите адаптер, как показано ниже

class TestListAdapter( private val context: Context):RecyclerView.Adapter<TestListAdapter.ViewHolder>()

    private val list = arrayListOf<TestModel> 

    public fun injectData(list : ArrayList<TestModel>){
    this.list.addAll(list)
    notifyDataSetChanged() 
} 

    {
        override fun getItemCount(): Int {
            return list.size
        }

        override fun onCreateViewHolder(p0: ViewGroup, p1: Int): ViewHolder {

            val view 

=LayoutInflater.from(context).inflate(R.layout.list_Test,p0,false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(p0: ViewHolder, p1: Int) {

        p0?.bindItem(list[p1])
    }


    class ViewHolder(itemView:View):RecyclerView.ViewHolder(itemView) {

        fun bindItem(Test:TestModel)
        {
            var name:TextView=itemView.findViewById<TextView>(R.id.CatName)
            name.text=Test.name

        }
    }
}

и в вашем TestClass:

            adapter = TestListAdapter(this)
            layoutManager = LinearLayoutManager(this)
            recyclerViewTest.layoutManager = layoutManager
            recyclerViewTest.adapter = adapter

         try {
            for (i in 0..response.length() - 1) {
                val Test=TestModel()
                val catObj = response.getJSONObject(i)

                var name = catObj.getString("name")

                Test.name = name
                Log.d("Name Result==>>", name)
                TestList!!.add(Test)
            }

            adapter.injectData(TestList);


        }catch (e: JSONException) { e.printStackTrace()}

И второстепенная вещь, пожалуйста, учтите, что при использовании !! вы должны проверить ноль перед использованием

Пример, вместо

TestList!!.add(Test)

Попробуйте

TestList?.let {
  it.add(Test)
}
...