【问题标题】:How to set speed of RecyclerView scroll?如何设置 RecyclerView 滚动的速度?
【发布时间】:2021-06-19 09:14:45
【问题描述】:

我是using RecyclerViewGridLayoutManagerRecyclerView Scroll 的速度太快了。我想让它慢下来。我确实尝试了许多其他代码和方法,但没有一个对我有用。

这是我发现的

  1. How to make RecyclerView scroll smoothly?

这篇文章建议在 onCreateViewHolderonBindViewHolder 中不应该有 I/O 操作,并且花费太多时间来执行这些方法中的任何一个都会产生延迟。但是,我没有 I/O 操作,也没有太多代码。

...
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_view, parent, false);
        return new MyViewHolder(view,listner);
    }

  @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        GlideApp.with(context)
                .load(arrayList.get(position).getUri())
                .apply(RequestOptoins.overrideOf(180,180))
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                .into(holder.img);
        Log.d("FetchImages(): "," Glide Called");
    }
...
  1. How can I control the scrolling speed of recyclerView.smoothScrollToPosition(position)?

这篇文章建议使用CustomLayoutManager 类。但是,这对我也不起作用。可能是因为所有答案都集中在LinearLayoutManager,可能不支持GridLayoutManager

  1. https://github.com/Azoft/CarouselLayoutManager/issues/79

我也试过这个链接,但是我不明白里面发生了什么。

4.https://programmer.group/android-recycler-view-slides-quickly-to-the-top.html

与此链接相同。什么都看不懂。

列表太长,无法在此处发布。但是,最终我尝试了所有我理解的代码。但是,到目前为止,似乎没有什么对我有用。

注意 我正在尝试显示来自外部存储的图像。因此,第一次加载 glide 将创建缩略图缓存,然后在第二次加载时不会有更大尺寸的图像。但是,我的手机里仍然有 5000 多张图片。并且一次 recyclerview 只能显示 40 张图像。因此,如果我不小心滚动快速其余图像将加载到前台。所以,我想禁用快速滚动,这样无论有多少照片,recyclerview 都只会显示加载的照片。

【问题讨论】:

  • 请勿使用大尺寸图片!
  • 我正在尝试显示来自外部存储的图像。因此,第一次加载 glide 将创建缩略图缓存,然后在第二次加载时不会有更大尺寸的图像。但是,我的手机里仍然有 5000 多张图片。并且一次 recyclerview 只能显示 40 张图像。所以,如果我不小心滚动快速其余的图像将在前台加载。所以,我想禁用快速滚动,这样无论有多少照片,recyclerview 都只会显示加载的照片。

标签: java android android-recyclerview


【解决方案1】:

您可以创建CustomRecyclerView 并通过覆盖fling() 方法来减慢它的速度。可以阅读官方文档here

@Override
public boolean fling(int velocityX, int velocityY) {
     velocityY *= FLING_SPEED_FACTOR; // keep it less than 1.0 to slowdown
     return super.fling(velocityX, velocityY);
} 

这只会降低投掷速度,即使投掷量相同,您的 RecyclerView 滚动也会减少。

【讨论】:

  • 对不起,我错误地放置了 androidx 已弃用的支持库链接。我已经更新了链接。
  • 但是,如何创建自定义 RecyclerView。我从未创建过自定义回收站视图。
  • 只需扩展 RecyclerView 并覆盖此方法。您可以在这里找到示例:gist.github.com/arjit-meesho/e511e4cee8e8e0579e2c2ed3500dcddb
【解决方案2】:

正如@Embydextrousu 所建议并给出了准确的解决方案。我想补充几点。

您必须将 XML 中的 RecyclerView 更改为您的 customRecyclerView 类。

...
<com.example.project.CustomRecyclerView
    android:id="@+id/recyclerview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android" />
...

那么你需要创建一个CustomRecyclerView类。

...
public class CustomRecyclerView  extends androidx.recyclerview.widget.RecyclerView {



    public CustomRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean fling(int velocityX, int velocityY) {
        velocityY *= 0.35; // keep it less than 1.0 to slowdown
        return super.fling(velocityX, velocityY);
    }
}
...

velocityY 根据需要在哪里更改。

并最终像这样在您的片段或活动中实现。

...
 CustomRecyclerView recyclerView;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = requireView().findViewById(R.id.recyclerview);
}
...

这会降低recyclerView滚动的速度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多