RecyclerView在ScrollView中滞后

时间:2016-12-13 07:09:47

标签: android xml android-recyclerview scrollview recyclerview-layout

我在服务器的RecyclerViewScrollView加载数据中有多个RecyclerView。当我向下滚动时,RecyclerView工作得很慢。我该如何解决?

 <Scrollview>
           <LinearLayout> 
                       <Recyclerview>  

                       <Recyclerview>

           </LinearLayout>
    </Scrollview>

2 个答案:

答案 0 :(得分:0)

通常,当RecyclerView出现滚动性能问题时,是因为

a)您在onBindView中做的工作太多,每次在屏幕上出现新项目时都会调用它。 b)您显示的视图引用了使用大量内存的对象(例如大图像),因此Android垃圾收集器(GC)必须做大量工作才能释放内存。一种快速而肮脏的测量(a)的方法类似于:

void onBindView(RecyclerView.ViewHolder holder, int position) {
    long startTime = System.currentTimeMillis();

    //..bind view stuff

    Log.i(TAG, "bindView time: " + (System.currentTimeMillis() - startTime));
}

这将使您大致了解bindView需要多长时间。如果大约是10ms,就可以了。如果大于10毫秒,则不好。如果> 50ms,那真的很糟糕。

对于(b),这实际上取决于您如何加载数据/图像。如果您使用的是Picasso或Glide之类的东西,那么很多东西都可以为您处理。您可以将onViewRecycled侦听器附加到RecyclerView,然后,如果您使用的是Glide / Picasso,请不要忘记调用recycle()方法(或所谓的方法)。

如果您要在此处手动加载图像,则可以在视图回收时调用ImageView.setImage(null)。另外,请确保仅按所需大小加载图像,并且如果要对图像进行加载/下采样处理,请确保图像在背景中发生。

如果使用自定义字体,请确保使用某种缓存机制。加载字体可能会很昂贵。

无论如何,(a)应该为您提供问题发生位置的线索。您可以在onBindView()中记录特定的调用以缩小范围。

答案 1 :(得分:-1)

由于图片不是recyclerviews,所以很懒,你需要使用PicassoGlide有效加载图片,请尝试.fit().centerCrop()