You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fragment中RecyclerView加载服务器数据不显示问题求助

RecyclerView在Fragment中无法显示数据(TextView可正常展示)

问题描述

在Fragment中使用RecyclerView展示服务器返回的数据时,RecyclerView完全不可见,但改用TextView展示响应数据能正常显示。已确认接口返回数据正常,相关代码如下:

HomeActivity.kt 相关代码

GlobalScope.launch(Dispatchers.IO) {
    try {
        val response: Response<GetAllPost> = apiService.getAllPost("Bearer $token")
        recyclerView = view.findViewById(R.id.recyclerView)

        if (response.isSuccessful) {
            val getAllPost: GetAllPost? = response.body()
            Log.d("YourFragment", "Response: ${getAllPost?.toString()}")
            getAllPost?.let {
                val dataItems: List<DataItem> = it.data?.filterNotNull() ?: emptyList()
                if (dataItems.isNotEmpty()) {
                    // 初始化adapter并设置给RecyclerView
                    val recyclerView: RecyclerView = view.findViewById(R.id.recyclerView)
                    recyclerView.layoutManager = LinearLayoutManager(requireContext())
                    val adapter = RecyclerViewAdapter(dataItems)
                    recyclerView.adapter = adapter
                }
            }
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

RecyclerViewAdapter 代码

class RecyclerViewAdapter(private val dataItems: List<DataItem>) :
    RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.arraylist, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val dataItem = dataItems[position]
        holder.txtJudulPost.text = "Judul Post: ${dataItem.judulPost}"
        holder.txtDeskripsi.text = "Deskripsi: ${dataItem.deskripsi}"
        holder.txtTanggalPost.text = "Tanggal Post: ${dataItem.tanggalPost}"
    }

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

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val txtJudulPost: TextView = itemView.findViewById(R.id.txtJudulPost)
        val txtDeskripsi: TextView = itemView.findViewById(R.id.txtDeskripsi)
        val txtTanggalPost: TextView = itemView.findViewById(R.id.txtTanggalPost)
    }
}

DataItem 数据类代码

data class DataItem(
    @SerializedName("listReply")
    val listReply: List<Any?>? = null,

    @SerializedName("fotoKonten")
    val fotoKonten: String? = null,

    @field:SerializedName("tanggalPost")
    val tanggalPost: String? = null,

    @SerializedName("deskripsi")
    val deskripsi: String? = null,

    @SerializedName("judulPost")
    val judulPost: String? = null,

    @SerializedName("upvote")
    val upvote: Int? = null,

    @SerializedName("user")
    val user: User? = null,

    @SerializedName("email")
    val email: String? = null,

    @SerializedName("idPost")
    val idPost: Int? = null
)

排查与解决建议

  • 必须在主线程更新UI:当前代码在Dispatchers.IO线程中操作RecyclerView,UI操作只能在主线程执行。修改方式是用withContext(Dispatchers.Main)包裹RecyclerView的初始化逻辑:
    GlobalScope.launch(Dispatchers.IO) {
        try {
            val response: Response<GetAllPost> = apiService.getAllPost("Bearer $token")
            if (response.isSuccessful) {
                val getAllPost: GetAllPost? = response.body()
                getAllPost?.let {
                    val dataItems: List<DataItem> = it.data?.filterNotNull() ?: emptyList()
                    withContext(Dispatchers.Main) {
                        val recyclerView: RecyclerView = view.findViewById(R.id.recyclerView)
                        recyclerView.layoutManager = LinearLayoutManager(requireContext())
                        val adapter = RecyclerViewAdapter(dataItems)
                        recyclerView.adapter = adapter
                    }
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    
  • 检查RecyclerView布局属性:确认布局文件中RecyclerView的layout_width和layout_height设置正确(比如match_parent或固定尺寸),避免设置为0dp或visibility="gone";同时检查父布局是否给RecyclerView留出了足够的显示空间。
  • 验证item布局有效性:检查R.layout.arraylist的根View及内部TextView的宽高设置,可给根View添加背景色来确认item是否被渲染;若字段可能为null,建议给TextView设置默认值(比如dataItem.judulPost ?: "无标题"),避免因null导致控件内容为空。
  • 确认数据传递正确性:在Adapter的getItemCount()和onBindViewHolder中添加Log,验证数据列表长度是否大于0,以及字段值是否正确赋值给控件。

内容的提问来源于stack exchange,提问作者tantina devega

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:30:15