Scenario-我正在开发一个应用程序,该应用程序在Viewpager中显示与特定日期有关的事件,其中每个页面代表一天(即,垂直的24小时,类似于Google日历)。每个页面/片段都包含一个垂直的滚动视图(它内部具有框架布局),并根据事件列表动态创建自定义视图(视图位置和尺寸基于相应的事件时间和持续时间)并将其添加到滚动视图中。
问题-我已经成功实现了视图创建部分,现在问题在于性能。有时,在浏览页面时,vewpager(使用FragmentStatePagerAdapter)会滞后。
有人请建议我如何减少延迟或实现此目的的更好方法
因此,当用户在视图之间滑动时有时会导致滞后,因此必须在3个视图上调用onCreateView
。>
我想到了2个性能改进,尽管只使用了一个。
1)视图持有人/模型样式,例如https://www.androidcode.ninja/android-viewholder-pattern-example/和https://developer.android.com/topic/libraries/architecture/viewmodel,其中通货膨胀和查找项目已重复使用/与onCreateView
活动分开。
我没有使用此方法
2)为动态视图创建裸露的骨骼视图(第一个视图是静态的,然后在位置1和2处有2个动态视图,其中包含动态数据不同方面的列表视图。)
列表视图被夸大,并且在这些视图的onCreateView
中将适配器设置为空列表,因此可以快速创建它们。
然后我在OnPageChangeListener
上添加了一个,通知adapter
支持ViewPager
该页面已更改
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
if (position == 1 || position == 2)
{
mSectionsPagerAdapter.notifyDataSetChanged();
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// Code goes here
}
@Override
public void onPageScrollStateChanged(int state) {
// Code goes here
}
});
notifyDataSetChanged
使viewPager调用getItemPosition
类中的FragmentStatePagerAdapter
来确定页面位置是否已更改,以及是否需要在新位置重新创建它。
然后在FragmentStatePagerAdapter
中,我用getItemPosition
覆盖
@Override public int getItemPosition(Object object) { if (object instanceof LogFragment) { LogFragment f = (LogFragment) object; if (f != null) { f.update(); } } else if (object instanceof SummaryFragment){ SummaryFragment f = (SummaryFragment) object; if (f != null) { f.update(); } } else { return POSITION_UNCHANGED; } return super.getItemPosition(object); }
这使我可以获取Fragment对象,然后在其上调用
update
方法,但仍返回POSITION_UNCHANGED
,因此viewpager并未尝试重新创建Fragments。
然后在Fragment的update
方法中,我得到了列表视图适配器并更新了数据。
public void update(){ adapter.clear(); adapter.addAll(datasource.getData()); }
因此,仅在实际显示页面时才执行动态数据的获取和显示,而在显示页面时由ViewPager预先创建(因为该预先创建的视图无论如何都已经过时了,所以该数据的显示和显示成本更高)进行更新)