使用RecyclerView进行视差标题效果

tyc*_*czj 15 android android-recyclerview

我想更改我目前已经使用的ListView,RecyclerView所以我可以使用StaggeredGridLayoutManager但是RecyclerView没有能力添加像ListView这样的标题.

通常使用ListView我在标题中设置一个空视图,并将图像放在listview下面,并通过滚动列表来转换底部图像以创建Parallax效果.

因此,如果没有标题,我怎样才能创建相同的视差效果RecyclerView

k0s*_*0sh 32

最简单的方法是使用下面onScrollListener而不依赖任何库.

View view = recyclerView.getChildAt(0);
if(view != null && recyclerView.getChildAdapterPosition(view) == 0)  {
     view.setTranslationY(-view.getTop() / 2);// or use view.animate().translateY();
}
Run Code Online (Sandbox Code Playgroud)

确保您的第二个viewHolder项目具有与抽屉/活动背景相匹配的背景颜色.所以滚动看起来是视差.

  • 要确保它是第一个适配器项,只需执行以下检查:if(view!= null && recyclerView.getChildAdapterPosition(view)== 0) (5认同)
  • 这很有效.+1代表少量代码.但是,recyclelerView上的`getChildAt(0)`将返回屏幕可见部分的第一个子节点,这并不总是实际列表中的标题/第一个视图.因此,保持对该视图的引用会更有效. (3认同)
  • @SubinSebastian绝对会占用第一个孩子,这取决于你,你想如何使用它.它可以基于您之前提供或知道的位置.选择是无限的:) (2认同)

Ped*_*ira 26

所以今天我试着将这种效果归档于RecyclerView.我能够做到这一点,但由于代码太多,我将在这里粘贴我的github项目,我将解释项目的一些关键点.

https://github.com/kanytu/android-parallax-recyclerview

首先,我们需要看getItemViewTypeRecyclerView.Adapter类.此方法定义了我们正在处理的视图类型.该类型将被传递到onCreateViewHolder我们可以膨胀不同的视图.所以我做的是:检查位置是否是第一个.如果是,则膨胀标题,如果不膨胀正常行.

我还添加了一个CustomRelativeLayout剪辑视图,因此我们对分隔符没有任何问题,并且行在标题顶部.

从这一点来看,你似乎知道其背后的其余逻辑.

最终结果是:

在此输入图像描述

编辑:

如果需要在适配器中插入某些内容,请确保通过在notifyItemChanged/Inserted方法中添加1来通知正确的位置.例如:

public void addItem(String item, int position) {
    mData.add(position, item);
    notifyItemInserted(position + 1); //we have to add 1 to the notification position since we don't want to mess with the header
}
Run Code Online (Sandbox Code Playgroud)

我做的另一个重要编辑是滚动逻辑.mCurrentOffset我使用的系统不适用于项目插入,因为如果添加项目,偏移量将会改变.所以我做的是:

ViewHolder holder = findViewHolderForPosition(0);
if (holder != null)
  ((ParallaxRecyclerAdapter) getAdapter()).translateHeader(-holder.itemView.getTop() * 0.5f);
Run Code Online (Sandbox Code Playgroud)

为了测试这个,我添加了一个postDelayedRunnable,启动了应用程序,滚动到最后,将项目添加到位置0,然后再次向上滚动.结果是:

在此输入图像描述

如果有人正在寻找其他视差效果,他们可以检查我的其他回购:

https://github.com/kanytu/android-parallax-listview

  • @tyczj那是因为你不能在位置0上添加任何东西.必须为标题保留位置0.如果将其插入位置1,则不会有任何问题. (2认同)