在 RecyclerView 上快速滚动

Fast Scrolling on RecyclerView

我想在回收站视图上启用 fling/fast 滚动。我的意思是,如果用户执行滑动动作,视图会继续滚动并开始减速(我猜这就是所谓的快速滚动)。

我在 ScrollView 中有一个 RecyclerView

<ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/scroll">

    <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/items"/>

</ScrollView>

我将布局管理器设置为线性

    RecyclerView itemsView = findViewById(R.id.items);
    stocksView.setLayoutManager(new LinearLayoutManager(this));

我确实有一个自定义适配器连接到 RecyclerView

public abstract class RecyclerAdapter<E>
        extends RecyclerView.Adapter<ItemView>
{
    private ItemTouchHelper touchHelper;

    protected final List<E> items = new ArrayList<>();

    protected RecyclerAdapter()
    {
    }

    @Override
    public void onBindViewHolder(@NonNull final ItemView holder, int position)
    {
    }

    @Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView)
    {
        super.onAttachedToRecyclerView(recyclerView);
        touchHelper = new ItemTouchHelper(new ItemTouchHelperCallback(this));
        touchHelper.attachToRecyclerView(recyclerView);
    }

    @Override
    public int getItemCount()
    {
        return items.size();
    }
}

我的 ItemTouchHelperCallback 是

public class ItemTouchHelperCallback
        extends ItemTouchHelper.Callback
{
    ItemTouchHelperCallback(RecyclerAdapter adapter)
    {
    }

    @Override
    public boolean isItemViewSwipeEnabled()
    {
        return true;
    }

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)
    {
        int dragFlags  = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        int swipeFlags = 0;
        return ItemTouchHelper.Callback.makeMovementFlags(dragFlags, swipeFlags);
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target)
    {
        if (source.getItemViewType() != target.getItemViewType())
        {
            return false;
        }

        return true;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int i)
    {
    }

    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState)
    {
        // We only want the active item to change
        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE)
        {
            // Let the view holder know that this item is being moved or dragged
            ((ItemView) viewHolder).onItemSelected();
        }

        super.onSelectedChanged(viewHolder, actionState);
    }

    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)
    {
        super.clearView(recyclerView, viewHolder);
        // Tell the view holder it's time to restore the idle state\
        ((ItemView) viewHolder).onItemClear();
    }
}

然而,每当我尝试滚动时,它都会在我抬起手指的那一秒停止。我如何让它继续尝试滚动。

从布局中删除 ScrollView,并且不要使用 wrap_content 作为 RecyclerView 的高度。 RecyclerView 本身已经提供了滚动功能,您可以使用 ScrollView 上的任何 layout_ 属性来使 RecyclerView 的大小合适。

你写了这个:

I have a RecyclerView in a ScrollView

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/scroll">

<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/items"/>

但是 RecyclerView 已经支持 fling,请从 xml 文件中删除 ScrollView。并设置 RecyclerView 的高度 match_parent,如下所示:

  <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/items"/>

使用滚动视图时,您需要关闭 nestedscroll 启用。

recyclerview.setNestedScrollingEnabled(false);

1- 将 ScrollView 更改为 NestedScrollView

2- 在 Recyclerview 和 NestedScrollView 中使用 app:layout_behavior="@string/appbar_scrolling_view_behavior"

<NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:id="@+id/scroll">

<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:id="@+id/items"/>

3- 使用 recyclerview.setNestedScrollingEnabled(false);