我在RecyclerView
和ScrollView
中有多个RecyclerView
从服务器加载数据。当我向下滚动它时,RecyclerView
的工作非常慢。我该如何解决?
<Scrollview>
<LinearLayout>
<Recyclerview>
<Recyclerview>
</LinearLayout>
</Scrollview>
通常,当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()中记录特定的调用以缩小范围。