使用包含大量数据的RecyclerViews优化ViewPager



我有一个包含五个FragmentViewPager。每个片段包含许多数据。例如,第一个片段是包含文本和图像的600个条目的列表。其他四个Fragment包含从600个值的列表中创建求值的图。我实现的优化是:

  1. 适配器内没有数据库选择
  2. 适配器内没有图像加载(我使用Picasso)
  3. 适配器内部没有数据分析

我还在AsyncTask中加载适配器的条目。对于RecyclerView,我设置以下选项:

this.listRowParent.setItemViewCacheSize(5);
this.listRowParent.setDrawingCacheEnabled(true);
this.listRowParent.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
this.listRowParent.setHasFixedSize(true);

通过我的所有优化,滚动非常流畅。我遇到的问题是当片段变得可见时会发生什么。当我设置适配器时,ui开始冻结(在100到300帧之间跳过)。我试图解决增加OffscreenPageLimit:的问题

this.viewPager.setOffscreenPageLimit(5);

但这有时会有所帮助。我想当设置适配器时,适配器的内部初始化在ui线程上执行了太多的工作,但我不知道如何提高性能。我在适配器和onBindViewHolder方法中执行的唯一操作是列表初始化中的比较。

如何进一步提高性能?例如,是否有可能将代码放在onBincViewHolder内部的AsyncTask内部,或者由于RecyclerView的机制,这是不可能的?

是的,可以将代码放置在AsyncTask中的onBincViewHolder中。您没有提供太多代码,我只能建议将您的UI逻辑和数据处理逻辑分离,然后将数据处理逻辑执行到工作线程中,同时向用户显示进度对话框,以通知后台中发生了一些事情

有时,当您确实有大量的数据,并且必须对它们进行一些繁重的处理时,对象的lazy loading是一种更好的方法。由于您没有提供太多代码,我只能建议将您的UI logicdata processing logic分离,然后将data processing logic执行到一个工作线程中,同时向用户显示进度对话框,以通知后台发生了一些事情。这样可以避免UI冻结带来的挫败感。

另一种方法可以是分段加载数据,并使用像notifyItemRangeInserted()这样的方法,这些方法比简单的notifyDataSetChanged()更有效。

最新更新