Android RecyclerView中CardView卡片运行时不显示排查
问题根因
你的判断准确,CardView无法展示的核心问题出在AdvertsFragment的onCreateView方法逻辑错误:
- 你在Fragment布局完成inflate之前,直接对
R.id.recycler_view这个Int类型的资源ID调用apply设置属性,根本没有获取到布局中真实的RecyclerView实例,所有设置LayoutManager、Adapter的操作全部无效,RecyclerView没有绑定适配器自然无法加载CardView条目。 - 你的卡片布局存在额外问题:根CardView高度设置为
match_parent,会导致单张卡片占满整个RecyclerView可视区域,后续条目被遮挡无法正常浏览。 - 卡片布局内两个TextView宽度写死236dp,小屏设备上会出现内容溢出、显示不全的问题。
修复方案
1. 修正Fragment生命周期内的RecyclerView初始化逻辑
和你项目MainActivity的视图绑定写法保持统一,在inflate拿到布局实例后再初始化RecyclerView,修正后代码如下:
class AdvertsFragment : Fragment() { private lateinit var binding: FragmentAdvertsBinding private lateinit var layoutManager: RecyclerView.LayoutManager private lateinit var adapter: RecyclerAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { // 先inflate布局,获取视图绑定实例 binding = FragmentAdvertsBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(itemView: View, savedInstanceState: Bundle?) { super.onViewCreated(itemView, savedInstanceState) // 布局创建完成后再对真实RecyclerView实例做初始化 layoutManager = LinearLayoutManager(requireContext()) adapter = RecyclerAdapter() binding.recyclerView.apply { this.layoutManager = this@AdvertsFragment.layoutManager this.adapter = this@AdvertsFragment.adapter setHasFixedSize(true) // 固定RecyclerView尺寸时开启,提升滑动性能 } } }
如果暂时不使用视图绑定,可以直接用findViewById写法:
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { val rootView = inflater.inflate(R.layout.fragment_adverts, container, false) val recyclerView = rootView.findViewById<RecyclerView>(R.id.recycler_view) recyclerView.layoutManager = LinearLayoutManager(activity) recyclerView.adapter = RecyclerAdapter() return rootView }
2. 修正card_layout.xml布局问题
调整根布局高度、优化文本控件约束,修正后代码如下:
<?xml version="1.0" encoding="utf-8"?> <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_margin="5dp" app:cardBackgroundColor="@color/oceanBlue" app:cardCornerRadius="12dp" app:cardElevation="3dp" app:contentPadding="4dp"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/forestGreen" android:id="@+id/relativeLayout" android:padding="16dp"> <ImageView android:id="@+id/item_image" android:layout_width="100dp" android:layout_height="100dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toLeftOf="parent"/> <TextView android:id="@+id/item_title" android:textColor="@color/black" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toEndOf="@+id/item_image" app:layout_constraintEnd_toEndOf="parent" android:layout_marginStart="16dp" android:textSize="30sp"/> <TextView android:id="@+id/item_detail" android:textColor="@color/black" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="8dp" app:layout_constraintTop_toBottomOf="@+id/item_title" app:layout_constraintStart_toEndOf="@+id/item_image" app:layout_constraintEnd_toEndOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.cardview.widget.CardView>
修复效果
重新编译运行后:
- RecyclerView可以正常加载所有CardView卡片条目
- 卡片高度自适应内容,支持正常滑动浏览所有条目
- 点击卡片可正常弹出点击提示Toast
- 不同尺寸屏幕下文本不会溢出显示不全
内容的提问来源于stack exchange,提问作者bn 41
相关产品推荐
相关产品推荐

