簡體   English   中英

Kotlin recyclerview on Fragment

[英]Kotlin recyclerview on Fragment

我試圖顯示一個列表的 recyclerview,該列表由一個片段上的凌空 api 請求提供,但不能每次返回此錯誤“lateinit property tareas view has not been initialized fragment”,

我嘗試使用 findviewbyid 來聲明它導致“未解析的引用”的 recyclerview

這是片段的代碼:

private lateinit var prefs: SharedPreferences
//private lateinit var tareaAdapter: TareaAdapter
private lateinit var viewOfLayout: View
private var listener: OnFragmentInteractionListener? = null
private lateinit  var recyclerView: RecyclerView
private lateinit var tareas: ArrayList<Tarea>

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    viewOfLayout = inflater!!.inflate(R.layout.fragment_tareas_generales, container, false)
    prefs = PreferenceManager.getDefaultSharedPreferences(activity!!.applicationContext)

    val recyclerView = viewOfLayout.findViewById<RecyclerView>(R.id.rvGeneralTareas)
    recyclerView.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(
        this@TareasGeneralesFragment.context!!,
        LinearLayout.VERTICAL,
        false
    )
    getTareaGenerales()
    val adapter = TareaAdapter(tareas)
    recyclerView.adapter = adapter
    return inflater.inflate(R.layout.fragment_tareas_generales, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
}

private fun getTareaGenerales() {
    val recyclerView = viewOfLayout.findViewById<RecyclerView>(R.id.rvGeneralTareas)
    if (!NetworkUtils.isConnected(this@TareasGeneralesFragment.context!!)) {
        Toast.makeText(this@TareasGeneralesFragment.context!!, R.string.error_internet2, 
     Toast.LENGTH_LONG).show()
    } else {
        val queue = Volley.newRequestQueue(this@TareasGeneralesFragment.context!!)
        val URL = "${Utils.URL_SERVER}guardias/tareas"
        val stringRequest = object : StringRequest(Method.GET, URL, Response.Listener<String> { 
           response ->
            try {
                var strResp = response.toString()
                val jsonObj: JSONObject = JSONObject(strResp)
                val jsonArray = jsonObj.getJSONArray("tareas")

                Log.d("paso","Connected to tareas generales $strResp")

                for (i in 0 until jsonArray.length()) {
                    var jsonInner: JSONObject = jsonArray.getJSONObject(i)
                    val id_tarea = jsonInner.get("id_tarea").toString().toInt()
                    val descripcion = jsonInner.get("descripcion").toString()
                    Log.d("add","$id_tarea,$descripcion")
                    tareas.add(Tarea(id_tarea,descripcion))
                }
                val adapter = TareaAdapter(tareas)
                recyclerView.adapter = adapter
            } catch (e: Exception) {
                e.printStackTrace()
                Toast.makeText(this@TareasGeneralesFragment.context!!, resources.getString(R.string.error_general), Toast.LENGTH_LONG).show()
            }
        }, Response.ErrorListener { error ->
            try {
                error.printStackTrace()
                Toast.makeText(this@TareasGeneralesFragment.context!!, JSONObject(String(error.networkResponse.data)).getString("message"), Toast.LENGTH_LONG).show()
            } catch (e: Exception) {
                Toast.makeText(this@TareasGeneralesFragment.context!!, resources.getString(R.string.error_general), Toast.LENGTH_LONG).show()
            }
        }) {
            override fun getHeaders(): MutableMap<String, String> {
                val headers = HashMap<String, String>()
                headers.put("token", prefs.getString("api_key", "")!!)
                return headers
            }
        }
        stringRequest.retryPolicy = DefaultRetryPolicy(180000, 1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)
        queue.add(stringRequest)
    }
}

companion object {
    fun newInstance(): TareasGeneralesFragment {
        return TareasGeneralesFragment()
    }
}

我想這與您將視圖膨脹兩次的事實有關。 首先,您在onCreateView中將其充氣到viewOfLayout ,然后返回inflater.inflate(R.layout.fragment_tareas_generales, container, false) 我猜您在onCreateView中的所有更改都是 null 並且在您返回新膨脹的視圖后立即失效。

  • 為什么不使用 kotlin 視圖綁定? 這很方便。
  • 如果願意,您可以簡單地使用您正在使用的布局中所述的 recyclerView 的 ID( R.layout.fragment_tareas_generales
  • 也許你應該嘗試在onViewCreated中做所有的視圖布局和適配器的東西

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM