RecyclerView在ScrollView中滞后

问题描述 投票:-1回答:2

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

 <Scrollview>
           <LinearLayout> 
                       <Recyclerview>  

                       <Recyclerview>

           </LinearLayout>
    </Scrollview>
android xml android-recyclerview scrollview recyclerview-layout
2个回答
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就可以了。如果它> 10ms则不好。如果它超过50毫秒,那真的很糟糕。

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

如果您在这里手动加载图像,那么可能只是在视图被回收时调用ImageView.setImage(null)。此外,请确保您只按所需大小加载图像,如果您正在进行任何处理以加载/缩减采样图像,请确保它在后台进行。

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

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


-1
投票

它是懒惰的,因为图像不是recyclerviews,你需要使用PicassoGlide高效加载图像尝试.fit().centerCrop()

© www.soinside.com 2019 - 2024. All rights reserved.