阻止 FragmentView 加载 RecyclerView 直到其聚焦?
Prevent FragmentView loading the RecyclerView until its focused?
我的应用程序和 3 个标签页中有一个简单的 FragmentView
。所有 3 个选项卡都有 RecyclerView
,问题是前两个选项卡并不那么复杂,而第三个选项卡使用一些复杂的操作并减慢应用程序,使其在执行这些操作时滞后。我的问题是:如何防止 FragmentView
调用 onCreateView
直到它被聚焦?
现在,当第二个选项卡获得焦点时,第三个选项卡开始执行这些操作。我希望它在聚焦第三个选项卡时开始执行这些方法。
这是我的代码:
tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setText("Tab1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab2"));
tabLayout.addTab(tabLayout.newTab().setText("Tab3"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
viewPager = (ViewPager) findViewById(R.id.pager);
adapter = new PagerAdapter
(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
这是我的适配器:
public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
public PagerAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
RingtonesActivityFragment Ringtones = new RingtonesActivityFragment();
return Ringtones;
case 1:
FavoritesActivityFragment Favorites = new FavoritesActivityFragment();
return Favorites;
case 2:
MySongsActivityFragment Songs = new MySongsActivityFragment();
return Songs;
default:
return null;
}
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
和标签:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.main, container, false);
...
...
...
return rootView;
}
默认情况下,ViewPager
将在当前页面的任一侧加载 1 个页面。即使您将 setOffscreenPageLimit
设置为小于 1,它也会将自身重置为 1。除非您根据自己的喜好修改 ViewPager
class,否则无法解决此问题。
为了帮助延迟执行代码,您可以使用 ViewPager.OnPageChangeListener
及其方法 onPageSelected(int position)
找出当前处于焦点的选项卡。一旦 Fragment
成为焦点,您就可以推迟所需的工作。
我还要补充一点,如果您正在做的工作会导致 UI 出现延迟,您可能需要考虑将工作转移到后台线程。如果工作与布局相关,而您不能在后台线程上完成,请使用 Hierarchy Viewer 或 Systrace 来帮助您优化。
我的应用程序和 3 个标签页中有一个简单的 FragmentView
。所有 3 个选项卡都有 RecyclerView
,问题是前两个选项卡并不那么复杂,而第三个选项卡使用一些复杂的操作并减慢应用程序,使其在执行这些操作时滞后。我的问题是:如何防止 FragmentView
调用 onCreateView
直到它被聚焦?
现在,当第二个选项卡获得焦点时,第三个选项卡开始执行这些操作。我希望它在聚焦第三个选项卡时开始执行这些方法。
这是我的代码:
tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setText("Tab1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab2"));
tabLayout.addTab(tabLayout.newTab().setText("Tab3"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
viewPager = (ViewPager) findViewById(R.id.pager);
adapter = new PagerAdapter
(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
这是我的适配器:
public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
public PagerAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
RingtonesActivityFragment Ringtones = new RingtonesActivityFragment();
return Ringtones;
case 1:
FavoritesActivityFragment Favorites = new FavoritesActivityFragment();
return Favorites;
case 2:
MySongsActivityFragment Songs = new MySongsActivityFragment();
return Songs;
default:
return null;
}
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
和标签:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.main, container, false);
...
...
...
return rootView;
}
ViewPager
将在当前页面的任一侧加载 1 个页面。即使您将 setOffscreenPageLimit
设置为小于 1,它也会将自身重置为 1。除非您根据自己的喜好修改 ViewPager
class,否则无法解决此问题。
为了帮助延迟执行代码,您可以使用 ViewPager.OnPageChangeListener
及其方法 onPageSelected(int position)
找出当前处于焦点的选项卡。一旦 Fragment
成为焦点,您就可以推迟所需的工作。
我还要补充一点,如果您正在做的工作会导致 UI 出现延迟,您可能需要考虑将工作转移到后台线程。如果工作与布局相关,而您不能在后台线程上完成,请使用 Hierarchy Viewer 或 Systrace 来帮助您优化。