Android RecyclerView两个元素之间的分隔符

时间:2016-08-18 12:41:39

标签: android

我需要在RecyclerView中的两个元素之间添加divider,但不要在每两个元素之间添加divider,只需在一个元素之间添加。

好的,我会以更好的方式解释你。 我有两组元素,我需要在它们之间制作某种自定义分隔符。 enter image description here

如何以最优化的方式实现这一目标。 我有想法改变ItemLayout并添加拆分器,但我认为这个选项不够快。

3 个答案:

答案 0 :(得分:0)

我的假设是您可能已经为蓝色和红色项目使用了不同的itemviewtypes。我建议为你的分隔符创建另一个itemviewtype,在你的数据列表中添加一个虚拟对象,然后检查RecyclerView.Adapter.onCreateViewHolder是否在instanceof的当前位置有这样一个对象。然后返回一个具有所需分隔符布局的视图。

有关viewtypes的教程可以在这里找到:How to create RecyclerView with multiple view type?

答案 1 :(得分:0)

我认为,对于奇异分割器使用其他类型的布局是一个不错的选择。 如果你警告性能,那么我会冷静下来,没有任何性能问题:

  • 您将使用一些静态文本或简单的可绘制(例如灰线)进行简单布局。创建这样的布局将花费几毫秒或更短的时间并且绑定它将花费更少的时间
  • 据我所知,
  • recycleler视图为每种类型的项目都有自己的缓存,因此您可以(可能只创建一次)拆分器,然后缓存以供将来绑定使用
  • 如果您查看为ListViews提供部分的库,那么您会看到他们也使用这种方法(我的意思是,他们将拥有默认类型和分割器类型项或部分类型的项目 - 项)

当然你可以使用ItemDecoration,但是你需要自己处理所有问题。您需要确定孩子的位置并决定是否需要绘制分割器。我认为这更痛苦。

答案 2 :(得分:0)

我在这里的解决方案https://pastebin.com/4J7sPaCF

public class SingleDividerDecoration extends DividerItemDecoration {

    private final int height;
    private int position = -1;

    public SingleDividerDecoration(Context context, @DrawableRes int dividerId) {
        super(context, LinearLayout.VERTICAL);
        Drawable divider = ContextCompat.getDrawable(context, dividerId);
        this.height = divider.getIntrinsicHeight();
        setDrawable(divider);
    }

    public void setPosition(int position) {
        this.position = position;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        int viewPosition = parent.getChildAdapterPosition(view);
        int dividerHeight = viewPosition == position ? height : 0;
        outRect.set(0, 0, 0, dividerHeight);
    }
}