Android RecyclerView无内容显示问题求助(附完整代码)
RecyclerView无法显示内容排查与修复
问题现象
从Firebase获取的数据经日志验证正常,但RecyclerView无法展示;手动创建测试用户数据测试,同样无法显示。
相关代码
list_users.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/user_list_bg" android:layout_margin="10dp"> <de.hdodenhof.circleimageview.CircleImageView android:id="@+id/user_profile_image_view" android:layout_width="90sp" android:layout_height="90sp" android:src="@drawable/user_image_placeholder" android:layout_margin="12dp" app:border_width="1sp" android:clickable="true" android:focusable="true"> </de.hdodenhof.circleimageview.CircleImageView> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:orientation="vertical"> <TextView android:id="@+id/user_name_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Hardik Dhuri" android:layout_marginBottom="10dp" android:textSize="24sp"/> <TextView android:id="@+id/last_message_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Hello Bro" android:textSize="16sp"/> </LinearLayout> </LinearLayout>
fragment_chats.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".main.fragments.ChatsFragment" xmlns:app="http://schemas.android.com/apk/res-auto"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/list_users_rv" android:layout_width="match_parent" android:layout_height="match_parent" tools:listitem="@layout/list_users" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/> </FrameLayout>
ListUsersAdapter.kt
package com.example.samvach.adapters import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.example.samvach.R import com.example.samvach.models.User class ListUsersAdapter(private val userList: ArrayList<User>) : RecyclerView.Adapter<ListUsersAdapter.MyViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.list_users, parent, false) return MyViewHolder(view) } override fun onBindViewHolder(holder: MyViewHolder, position: Int) { val item = userList[position] holder.name.text = item.name } override fun getItemCount(): Int { return userList.size } class MyViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { val name: TextView = itemView.findViewById(R.id.user_name_tv) } }
ChatsFragment.kt
package com.example.samvach.main.fragments import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.RecyclerView import com.example.samvach.R import com.example.samvach.adapters.ListUsersAdapter import com.example.samvach.databinding.FragmentChatsBinding import com.example.samvach.models.User import com.google.firebase.database.* class ChatsFragment : Fragment() { private lateinit var binding: FragmentChatsBinding private lateinit var dbref: DatabaseReference private lateinit var usersArrayList: ArrayList<User> companion object { fun newInstance() = ChatsFragment() } private lateinit var viewModel: ChatsViewModel override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_chats, container, false) } @Deprecated("Deprecated in Java") override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) viewModel = ViewModelProvider(this)[ChatsViewModel::class.java] binding = FragmentChatsBinding.inflate(layoutInflater) binding.listUsersRv.setHasFixedSize(true) usersArrayList = arrayListOf( User( name = "Banana" ), User( name = "Apple" ), User( name = "Kiwi" ), User( name = "Orange" ) ) binding.listUsersRv.adapter = ListUsersAdapter(usersArrayList) // getUserData() } private fun getUserData() { dbref = FirebaseDatabase.getInstance().getReference("users") dbref.addValueEventListener(object : ValueEventListener { override fun onDataChange(snapshot: DataSnapshot) { usersArrayList.clear() if (snapshot.exists()) { for (userSnapshot in snapshot.children) { val user = userSnapshot.getValue(User::class.java) Log.i("USER", "${user!!.name}") usersArrayList.add(user) } binding.listUsersRv.adapter = ListUsersAdapter(usersArrayList) } } override fun onCancelled(error: DatabaseError) { TODO("Not yet implemented") } }) } }
User.kt
package com.example.samvach.models data class User ( var email: String?= null, var name: String?= null, var profilePicture: String?= null, var uid: String?= null, )
问题根源与修复方案
核心问题:Binding对象未关联到Fragment视图
在onCreateView中直接inflate返回布局,但onActivityCreated里又重新inflate了一次FragmentChatsBinding,这个新实例的视图从未被添加到Fragment中,导致操作的RecyclerView是一个未挂载的空视图,自然无法显示内容。
修复步骤
- 在
onCreateView中通过Binding初始化布局并返回根视图,确保整个Fragment使用同一个Binding实例。 - 替换废弃的
onActivityCreated为onViewCreated处理视图初始化逻辑。
修改后的ChatsFragment.kt:
package com.example.samvach.main.fragments import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.example.samvach.adapters.ListUsersAdapter import com.example.samvach.databinding.FragmentChatsBinding import com.example.samvach.models.User import com.google.firebase.database.* class ChatsFragment : Fragment() { private lateinit var binding: FragmentChatsBinding private lateinit var dbref: DatabaseReference private lateinit var usersArrayList: ArrayList<User> companion object { fun newInstance() = ChatsFragment() } private lateinit var viewModel: ChatsViewModel override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { // 初始化Binding并返回根视图 binding = FragmentChatsBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel = ViewModelProvider(this)[ChatsViewModel::class.java] binding.listUsersRv.setHasFixedSize(true) usersArrayList = arrayListOf( User(name = "Banana"), User(name = "Apple"), User(name = "Kiwi"), User(name = "Orange") ) binding.listUsersRv.adapter = ListUsersAdapter(usersArrayList) // 如需加载Firebase数据,取消注释 // getUserData() } private fun getUserData() { dbref = FirebaseDatabase.getInstance().getReference("users") dbref.addValueEventListener(object : ValueEventListener { override fun onDataChange(snapshot: DataSnapshot) { usersArrayList.clear() if (snapshot.exists()) { for (userSnapshot in snapshot.children) { val user = userSnapshot.getValue(User::class.java) user?.let { Log.i("USER", "${it.name}") usersArrayList.add(it) } } // 推荐:更新现有适配器数据而非重新创建 (binding.listUsersRv.adapter as ListUsersAdapter).notifyDataSetChanged() } } override fun onCancelled(error: DatabaseError) { Log.e("Firebase", "数据获取失败: ${error.message}") } }) } }
额外优化
- 避免反复创建适配器,调用
notifyDataSetChanged更新数据提升性能。 - 处理User对象可能为空的情况,避免空指针异常。
- 使用官方推荐的
onViewCreated替代废弃的onActivityCreated。
内容的提问来源于stack exchange,提问作者Hardik Dhuri
相关产品推荐
相关产品推荐

