在 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);
我想在回收站视图上启用 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);