Android Sticky header RecyclerView/ Section Header RecyclerView

Posted

技术标签:

【中文标题】Android Sticky header RecyclerView/ Section Header RecyclerView【英文标题】:Android sticky header RecyclerView/ Section Header RecyclerView 【发布时间】:2014-09-11 14:44:24 【问题描述】:

大家好,我刚刚创建了一个演示来使用新的 android L 小部件 RecyclerView。我还使用 SwipeRefreshLayout 实现了 Pull-To-Refresh,但现在我的问题是如何在这里实现粘性标头,因为当我尝试设置

mRecyclerView.setOnScrollListener(new OnScrollListener() 

    @Override
    public void onScrolled(int arg0, int arg1) 

    

    @Override
    public void onScrollStateChanged(int arg0) 
        // TODO Auto-generated method stub

    
);

我只有这两种方法,所以不知道如何处理这个......

请帮忙..

【问题讨论】:

请说明您正在寻找哪种类型的置顶标题?只有一个标题?滚动时会占据最后一个位置的任意数量的类别样式标题? 请参考 Instagram.. 像 Instagram 一样,我正在寻找粘性标题,或者您可以说部分标题,其中每一行都会有该标题,该标题会一直停留在顶部,直到其内容滚动! 【参考方案1】:

由于之前的答案没有提供可靠的解决方案,我为 RecyclerView 提出了我的 FlexibleAdapter 库,它能够同时处理以下所有功能:

带有 Sections 的标题的粘性功能,适用于所有 3 个 LayoutManager 和 ViewPager。 选择模式。 具有自动映射功能的多种项目类型。 预定义的 ViewHolders。 具有选择一致性的可扩展项目。 可拖动和滑动即可关闭。 带有可扩展文本的动画异步过滤器。 滚动动画。 带有适配器绑定的 EndlessScroll。 UndoHelper 和 ActionMode 助手。 FastScroller。 ...等等。

背后的想法是避免从头开始为每个项目重新创建一个自定义适配器,并在一个库中拥有更多功能,而不是依赖于仅支持其中 1 或 3 个并且无法合并的不同库。

【讨论】:

您能否查看这篇文章:How to offer personal open-source libraries??您似乎在各个地方发布有关您的图书馆的信息,而没有根据上下文调整您的答案。 好的,我已经读过了。我总是试图停留在上下文中,但实际上,以前的 cmets 表示提出的解决方案不起作用。所以,这就是我提出我的图书馆的原因。【参考方案2】:

public void onScrolled(int dx, int dy)

这些是您收到onScrolled 的两个参数,这意味着 RecyclerView 在 X 和 Y 轴上更改的像素数......所以您可能想要做的就是:

@Override
public void onScrolled(int dx, int dy) 
   if(dx < 0) // going up
      showSitckyHeader();

您可以通过添加最小滚动量来进一步改进此实现。比如:

int totalScrolled = 0;
@Override
public void onScrolled(int dx, int dy) 
   totalScrolled += dx;
   if(totalScrolled < MIN_SCROLL)
      showSitckyHeader();
   if(dx > 0)
      totalScrolled = 0;


@Override
public void onScrollStateChanged(int newState) 
   if(newState == SCROLL_STATE_IDLE || newState = SCROLL_STATE_SETTLING)
       totalScrolled = 0;

甚至更进一步,实现速度,计算时间,但这些类型的实现比较棘手,你必须自己测试。

【讨论】:

感谢您的指导。我会尝试您的方法,但担心的是当 recycleview 向上滚动时,我必须找到哪个项目位于顶部,然后我必须在该项目中找到标题视图并设置保证金还是有更好的办法? 我对“粘性标题”的理解是,当用户向上滚动时,标题可以随时显示。这意味着实际的标头不是 RecyclerView 视图的一部分,而是在 FrameLayout 中,其中包含 Header 和 RecyclerView。 RecyclerView 上的第一个视图将是一个与标题大小相同的空视图。每当列表上下移动时,您只需动画/上下移动标题。一个有用的方法是developer.android.com/reference/android/view/… 不要使用边距来实现该效果。 不..你误会了..我想要像 Instagram 这样的粘性标题,其中每一行都有一个标题视图,直到该项目不向上滚动为止... 所以是的,我相信你必须做一些类似于你在之前评论中建议的事情。查找第一个视图等。 @Budius 但是,协调器布局只粘在第一个项目上,如果我希望在滚动RecyclerView 时让某些项目保持粘性,那么我该怎么做呢?跨度>

以上是关于Android Sticky header RecyclerView/ Section Header RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章

css Sticky Header che varia allo scroll

markdown Venture - Sticky Mobile Header,顶部有公告栏

css 如何在Genesis中设置Sticky Header或Navigation

UICollectionView 隐藏/防止单元格在 Sticky Header 后面滚动

eowise 无法捕获 Sticky Header (RecyclerView) 的子视图的触摸事件

iOS UITableView 类似 Flex Air 的 Sticky Header Index 列表