最新的 RecyclerView 嵌套在 NestedScrollView 与 ItemTouchHelper

Latest RecyclerView nesting in NestedScrollView with ItemTouchHelper

使用最新的 update to RecyclerView,它现在可以 wrap_content 在 NestedScrollView 中。但是,有些行为不适合我,我正在寻找答案。

问题一:换行不占空格。这意味着如果 RecyclerView 内容之后有空格,拖动动画将在屏幕中间剪裁该项目,如下所示:

更新:解决了问题 1。我只需要将 layout_weight="1" 属性添加到 RecyclerView。

问题 2: 与问题一类似,删除项目时,RecyclerView 将在动画开始时立即换行 - 导致动画剪辑,如下所示:

UPDATE: 问题2还是没有解决,但是没有以前那么明显了。当项目被移除时,项目现在剪辑到视口,使它看起来像屏幕跳到新的高度,动画从视口下方拉起。

问题三:添加新item时,想滚动到ScrollView的末尾。但是,在我的添加事件中 运行 以下代码后,滚动立即跳转到滚动视图的当前末尾。 "after the item has been inserted"有回调吗?

public void addItem(T item) {
    items.add(item);
    notifyItemInserted(items.size() - 1);
    scroll.fullScroll(View.FOCUS_DOWN)
}

更新:问题 3 仍未解决,但我找到了一种解决方法,可以像这样颠倒顺序:

layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true);

然后在添加新项目时使用以下代码。这样,无论高度如何,滚动总是有效。

nestedScrollView.fullScroll(View.FOCUS_UP);

文章引用:

Note that although RecyclerView animates its children, it does not animate its own bounds changes. If you would like to animate the RecyclerView bounds as they change, you can use the Transition APIs.

好吧,我不需要为边界设置动画,但我确实希望它捕捉并填充视口(在这种情况下我不能使用 match_parent,因为我上面有一些静态视图回收站视图)。从而解决问题1.

我想在更改边界之前做一些事情。示例:在删除项目时为删除设置动画,然后应用绑定更改。从而解决问题2.

相反,我想在边界已经改变的情况下做一些事情。示例:添加新项目时,首先应用新绑定,然后启动滚动动画。从而解决问题3.

知道如何实现吗?

我找到了一个更好的解决方案来完成我想做的事情。比试图弄清楚新的 LinearLayoutManager 如何包装内容要简单得多。

而不是这个:

<NestScrollView>
  <LinearLayout>
    <View></View>
    <View></View>
    <RecyclerView></RecyclerView>
  </LinearLayout>
</NestScrollView>

我只和回收商一起去了,并在 RecyclerView 本身中管理 header:

<FrameLayout>
  <RecyclerView></RecyclerView>
</FrameLayout>

现在管理起来容易多了,因为我可以将任何视图放在项目的上方或下方。

在此处使用此解决方案:Link