具有自定义视图的Viewpager优化

问题描述 投票:0回答:1

Scenario-我正在开发一个应用程序,该应用程序在Viewpager中显示与特定日期有关的事件,其中每个页面代表一天(即,垂直的24小时,类似于Google日历)。每个页面/片段都包含一个垂直的滚动视图(它内部具有框架布局),并根据事件列表动态创建自定义视图(视图位置和尺寸基于相应的事件时间和持续时间)并将其添加到滚动视图中。

问题-我已经成功实现了视图创建部分,现在问题在于性能。有时,在浏览页面时,vewpager(使用FragmentStatePagerAdapter)会滞后。

有人请建议我如何减少延迟或实现此目的的更好方法

android android-viewpager android-custom-view
1个回答
0
投票
这对于静态视图非常有效,但是对于具有动态数据的视图,预先创建的视图通常已经过时,并且在用户滑动到该视图时需要重新生成。

因此,当用户在视图之间滑动时有时会导致滞后,因此必须在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预先创建(因为该预先创建的视图无论如何都已经过时了,所以该数据的显示和显示成本更高)进行更新)

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