【问题标题】:Kotlin recyclerview on FragmentKotlin recyclerview on Fragment
【发布时间】:2020-06-27 00:09:13
【问题描述】:

我试图显示一个列表的 recyclerview,该列表由片段上的 volley 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()
    }
}

【问题讨论】:

  • 从 val recyclerView = viewOfLayout 中移除 'val'。 ... onCreateView 内部

标签: android android-fragments kotlin android-recyclerview


【解决方案1】:

我想这与您将视图膨胀两次的事实有关。首先你将它在onCreateView 内膨胀到viewOfLayout,然后你返回inflater.inflate(R.layout.fragment_tareas_generales, container, false)。我猜你在onCreateView 中的所有更改在你返回一个新膨胀的视图时都是无效的。

  • 为什么不使用 kotlin 视图绑定?挺方便的。
  • 如果您愿意,您可以简单地使用您正在使用的布局中所述的 recyclerView 的 ID (R.layout.fragment_tareas_generales)
  • 也许你应该尝试在onViewCreated 中做所有的视图布局和适配器的东西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2018-04-18
    相关资源
    最近更新 更多