【问题标题】:Adding dividers in GridLayout RecyclerView在 GridLayout RecyclerView 中添加分隔线
【发布时间】:2017-07-14 13:05:59
【问题描述】:

我尝试向我的 GridLayout RecyclerView 添加水平分隔线。但是由于某种原因,分隔线没有出现。

作为替代方案,我使用了带有 2 个参数的 addItemDecoration 方法,其中第二个参数是要添加 ItemDecoration 的索引。

RecyclerView r = (RecyclerView) findViewById(R.id.recycler_view);
r.setAdapter(new AppAdapter(this, fetchData());
r.setLayoutManager(new GridLayoutManager(this, 5));
r.addItemDecoration(new DividerItemDecoration(this, GridLayoutManager.HORIZONTAL), 2);

它强制关闭,但出现以下异常:

Caused by: java.lang.IndexOutOfBoundsException: Index: 2, Size: 0

这个尺寸意味着什么?为什么是零?

可能是因为我在 Activity 而不是 Fragment 中使用了这个 RecyclerView?

P.S.:适配器没有问题;它不是空的。

【问题讨论】:

  • 当你做 addItemDecoration(new DividerItemDecoration(this, GridLayoutManager.HORIZONTAL), 2);您正在尝试在索引 2 处添加分隔符,但错误告诉您这是超出范围的,因为 RecyclerView 中的子项数为 0(它为空)。去掉那条线,如果有任何显示,请告诉我。
  • 适配器或recyclerView不为空。显示正确的列表而不写该行。
  • 您的列表中有多少项?如果少于 10 行(也就是少于 2 行),那么这可能是问题
  • 超过 50 项。

标签: android android-recyclerview indexoutofboundsexception gridlayoutmanager


【解决方案1】:

错误是因为您告诉 RecyclerView 绘制装饰编号 2,而没有告诉它绘制编号 1 和 0 的内容。

(它被实现为按顺序绘制的装饰物 ArrayList,它试图将索引 2 处的装饰物插入空的 ArrayList - 因此 OutOfBounds!)

编辑:这是一个工作示例:

我已经测试了这段代码,如果您进行以下更改,它可以正常工作:

1- 使用方法的单参数版本,索引版本将给出超出范围的解释(您需要从0开始索引)。

r.addItemDecoration(new SpacesItemDecoration(10));

2- 使用以下 ItemDecoration 类:

public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
    private int space;

    public SpacesItemDecoration(int space) {
        this.space = space;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.bottom = space;
    }
}

这只会在底部为您提供空间(用于水平分隔线)。

3 - 更改您的 RecyclerView 布局,以便您的 RecyclerView 的背景颜色是您希望分隔线的颜色:

<android.support.v7.widget.RecyclerView
                                                    android:layout_width="match_parent"
                                                    android:layout_height="match_parent"
                                                    android:background="#000000"> # DIVIDER COLOUR

            </android.support.v7.widget.RecyclerView>

4- 更改项目布局,使根项目的背景不透明,并且与 RecyclerView 的颜色不同(显然)

<RelativeLayout
            android:id="@+id/item_root"
            android:background="#cc00cc"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

之前没有显示的原因可能是因为 RecyclerView 背景和项目背景相同,所以分隔线不可见。

此方法适用于线性和网格布局管理器。

我希望这(终于!)有所帮助:)

【讨论】:

  • 我已经尝试过使用自定义项目装饰类。 IndexOutOfBounds 异常仍然不断弹出。
  • 你的意思是你在使用LinearLayoutManager的时候会报错吗?
  • 我的意思是,我创建了一个特定于 GridLayoutManager 的自定义 ItemDecoration 类,但它仍然以同样的方式失败。
  • 我刚刚完成了您将 layoutmanager 更改为 LinearLayoutManager 的建议。并且带有 2 个参数的 addItemDecoration() 仍然会以相同的错误强制关闭应用程序。并且带有单个参数的 addItemDecoration() 不会对输出产生影响。
  • 你能给我看看你的ItemDecoration类代码吗?
【解决方案2】:

这样使用:

创建一个名为 divider_shape.xml

的形状
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <size
        android:width="1dp"
        android:height="1dp" />
    <solid android:color="@color/primary" />
</shape>

对垂直和水平使用 DividerItemDecoration

val verticalDecorator = DividerItemDecoration(view.context, DividerItemDecoration.VERTICAL)
val horizontalDecorator = DividerItemDecoration(view.context, DividerItemDecoration.HORIZONTAL)

val drawable = ContextCompat.getDrawable(view.context, R.drawable.divider_shape)
verticalDecorator.setDrawable(drawable!!)
horizontalDecorator.setDrawable(drawable!!)

view.recyclerView.apply {
    addItemDecoration(verticalDecorator)
    addItemDecoration(horizontalDecorator)
    layoutManager = GridLayoutManager(view.context, 2)
    adapter = movieAdapter
}

【讨论】:

    猜你喜欢
    • 2017-05-23
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 2021-11-23
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多