RecyclerView Item Decoration负边距设置时条目层级颠倒问题如何解决
实现RecyclerView条目前项覆盖后项的重叠效果方案
问题原因
RecyclerView默认的绘制逻辑是按条目position从小到大依次绘制,position更大的靠后条目会后绘制,因此会自然覆盖在更早绘制的前面条目之上,这就是你当前遇到的层级颠倒问题的根本原因。你给条目根布局设置负边距实现重叠的逻辑本身是正确的,只需要调整绘制层级规则即可。
解决方案
方案1:修改RecyclerView全局子View绘制顺序
该方案不需要修改单个条目或Adapter逻辑,仅需给RecyclerView配置绘制规则即可:
- 先开启RecyclerView的自定义绘制顺序开关
- 设置绘制顺序回调,反转绘制优先级,让靠后的条目先绘制,靠前的条目后绘制,即可实现前项覆盖后项的效果
Java示例代码:
// 开启自定义子View绘制顺序 recyclerView.setChildrenDrawingOrderEnabled(true); // 设置绘制顺序回调 recyclerView.setChildDrawingOrderCallback(new RecyclerView.ChildDrawingOrderCallback() { @Override public int getChildDrawingOrder(int childCount, int i) { // 反转绘制顺序,优先绘制position更大的条目 return childCount - 1 - i; } });
Kotlin示例代码:
recyclerView.apply { isChildrenDrawingOrderEnabled = true setChildDrawingOrderCallback { childCount, i -> childCount - 1 - i } }
方案2:动态设置条目Z轴层级
利用Android原生Z轴显示规则:Z值更高的View会覆盖在Z值更低的View之上,在Adapter绑定数据时为不同position的条目设置不同的Z值即可:
@Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { // position越小的条目Z值越高,会显示在更上层 holder.itemView.setTranslationZ(200 - position); // 其他数据绑定逻辑... }
注意:你当前的条目内部已经包含带translationZ的元素(半圆View设置了translationZ=3dp、FloatingActionButton自带默认Z值),设置条目Z值时要保证数值差足够大,避免出现条目内部元素层级错乱的问题。
内容的提问来源于stack exchange,提问作者Alireza Noorali
相关产品推荐
相关产品推荐

