首页 > 解决方案 > 从 Fragments 中的 URL 读取数据

问题描述

我正在尝试从 API 读取数据并将其显示到片段内的回收器视图中。以下是我制作的代码

class MyTask : Fragment() {
    lateinit var p:ArrayList<listfetch>
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val rootView = inflater?.inflate(R.layout.fragment_my_task,container,false)
        var rv= rootView?.findViewById(R.id.tasklist) as RecyclerView
        rv.layoutManager = LinearLayoutManager(activity)

        val userkeypref = UserkeyPref(activity)
        val userkey = userkeypref.getKeyValue()

        val url = "http://myurl/getMyTask.php?userkey=" + userkey
        AsyncTaskHandleJson().execute(url)

        var adapter = Rec_data_adapter(p)
        rv.adapter=adapter
        return rootView
    }
    inner class AsyncTaskHandleJson: AsyncTask<String, String, String>(){
        override fun doInBackground(vararg url: String?): String {
            var text: String
            val connection = URL(url[0]).openConnection() as HttpsURLConnection
            try{
                connection.connect()
                text = connection.inputStream.use{it.reader().use { reader->reader.readText() }}
            }
            finally{
                connection.disconnect()
            }
            return text
        }
        override fun onPostExecute(result: String) {
            super.onPostExecute(result)
            handleJson(result)
        }
    }
    private fun handleJson(JsonString : String?){
        val jsonArray = JSONArray(JsonString)
        var x = 1
        if(jsonArray.length()>1){
            while(x<jsonArray.length()){
                val jsonObject = jsonArray.getJSONObject(x)
                p.add(listfetch(jsonObject.getString("id"),jsonObject.getString("status"),
                    jsonObject.getString("doc"),jsonObject.getString("title"),
                    jsonObject.getString("description")
                ))
                x++
            }
        }
        else{
            p.add(listfetch("1","1","1","1","1"))
        }
    }
}

现在我收到错误

kotlin.UninitializedPropertyAccessException:lateinit 属性 p 尚未在 androidx 的 androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439) 的 pro.oaks.android.taskup.MyTask.onCreateView(MyTask.kt:31) 处初始化。 fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)

标签: androidandroid-fragmentskotlin

解决方案


您必须p在使用它之前初始化您的值。例如:

class MyTask : Fragment() {
    val p = arrayListOf<listfetch>()
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
...

推荐阅读