android - 如何让我的慢 ViewPager 工作得更快
问题描述
我已经创建Activity
来处理ViewPager
. 一开始它运行良好,但后来我不得不添加更多代码,以使其在选择页面时刷新我的页面。我已经通过onResume()
在每次页面更改时调用方法来处理它。
我已经优化了我的片段,清除inside onResume()
了每个片段中不必要的代码(),但这没有结果。这就是我的活动的样子:
public class MainTabsActivity extends AppCompatActivity implements FullList.OnListFragmentInteractionListener, AcceptedList.OnListFragmentInteractionListener, StartedList.OnFragmentInteractionListener {
private static final int NUM_TABS = 3;
private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;
TabLayout tabLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_tabs);
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.setOffscreenPageLimit(2);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {
}
@Override
public void onPageSelected(int i) {
Fragment fragment = ((SectionsPagerAdapter)mViewPager.getAdapter()).getFragment(i);
if (fragment != null) {
Log.e("PAGE SELECTED", " " + i);
tabLayout.getTabAt(i).select();
fragment.onResume();
}
}
@Override
public void onPageScrollStateChanged(int i) {
}
});
Intent i = getIntent();
int pageNum = i.getIntExtra("pagenumber", 0);
mViewPager.setCurrentItem(pageNum);
tabLayout.getTabAt(pageNum).select();
mViewPager.invalidate();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main_tabs, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onListFragmentInteraction(DummyContent.DummyItem item) {
}
@Override
public void onFragmentInteraction(Uri uri) {
}
public class SectionsPagerAdapter extends FragmentPagerAdapter {
private Map<Integer, String> mFragmentTags;
private FragmentManager mFragmentManager;
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
mFragmentTags = new HashMap<>();
mFragmentManager = fm;
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
switch(position) {
case 0:
return getString(R.string.tab_text_1);
case 1:
return getString(R.string.tab_text_2);
case 2:
return getString(R.string.tab_text_3);
}
return null;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
FullList tab1 = new FullList();
return tab1;
case 1:
AcceptedList tab2 = new AcceptedList();
return tab2;
case 2:
StartedList tab3 = new StartedList();
return tab3;
default:
return null;
}
}
@Override
public int getCount() {
return NUM_TABS;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
Object obj = super.instantiateItem(container, position);
if (obj instanceof Fragment) {
Fragment f = (Fragment) obj;
String tag = f.getTag();
mFragmentTags.put(position, tag);
}
return obj;
}
public Fragment getFragment(int position) {
String tag = mFragmentTags.get(position);
if (tag == null) return null;
return mFragmentManager.findFragmentByTag(tag);
}
}
}
我已经添加了代码来调用onResume()
方法,但有趣的是,Fragments
只有在我从另一个打开它时才加载这么长时间Activity
,而不是在页面之间滚动时(那时一切正常),在更改之前一切都很好。
有没有办法让这项工作更快?
解决方案
您无需编写 onPageSelected 代码即可更改选项卡选择。
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.setOffscreenPageLimit(2);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager); // this will synchronize our tablayout with your viewpager
您不应该onResume
直接调用,这是一个系统事件,不建议调用此 void。
另外,在您的情况下,无需致电mViewPager.invalidate()
推荐阅读
- python - 从 CVXPY 数组中提取数字
- python - AttributeError:“元组”对象没有属性“写入”错误
- c# - 另一个 DbContext 上的 ASP.NET DbSet 标识属性
- c# - 日期字段未填充在 Razor 页面中
- git - WebStorm 的默认变更列表需要很长时间才能更新
- python - Python最有效的数据结构来保存值并检查值是否存在
- flutter - 无法构建 AAR,找不到任务“assembleAarDebug”
- php - 如何延迟测试 Laravel 作业?
- reinforcement-learning - 具有稳定基线的自定义 Openai 健身房环境
- flutter - 在 ListView.builder 中显示信息时出现问题