在ViewPager中加载片段只有当它被选中时
问题描述:
我有一个带有3个选项卡的ViewPager。在ViewPager中加载片段只有当它被选中时
我在每个碎片中加载大数据。
该应用程序加载每个片段,但我只想选择它时加载片段。
我该怎么做?我不知道。 我在等你的帮助。谢谢
我的代码:
public class Fragments extends AppCompatActivity {
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_tabs);
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new FirstFragment(), "1");
adapter.addFragment(new SecondFragment(), "2");
adapter.addFragment(new ThirdFragment(), "3");
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
答
使用寻呼机布局这个完整的代码
mPager = (ViewPager)findViewById(R.id.pager);
mPager.setPageTransformer(true, new ZoomOutPageTransformer());
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
PagerTitleStrip pts=(PagerTitleStrip)findViewById(R.id.titles);
pts.setNonPrimaryAlpha(0);
TabLayout tl=(TabLayout)findViewById(R.id.diary_tabs);
tl.setupWithViewPager(mPager);
mPager.setAdapter(mPagerAdapter);
for (int i = 0; i < tl.getTabCount(); i++) {
TabLayout.Tab tab = tl.getTabAt(i);
tab.setCustomView(getTabView(i));
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new Fragment1();
case 1:
return new Fragment2();
case 2:
return new Fragment3();
case 3:
return new Fragment4();
case 4:
return new Fragment5();
default:
return new Fragment6();
}
}
@Override
public int getCount() {
return NUM_PAGES;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return getResources().getString(R.string.string1);
case 1:
return getResources().getString(R.string.string2);
case 2:
return getResources().getString(R.string.string3);
case 3:
return getResources().getString(R.string.string4);
case 4:
return getResources().getString(R.string.string5);
default:
return super.getPageTitle(position);
}
}
}
答
是否有可能禁用屏幕外页数限制?
不是。它已被设置为最小可能值:查看页面的每一侧有一页。这对于使动画效果起作用是必要的 - 您可以同时看到两个片段(原始和新的)的部分。
答
在
OncreateView(){
//.... dont initialize your view here
if(isMenuVisible()) { // menu should be visible if current fragment is visible right now
setUserVisibleHint(true); // manually set value to true
}
}
在
oncreate(){
setHasOptionsMenu(true);
}
最后有方法称为setuservisiblehint()仅调用时,这个片段对用户可见这是你shud初始化所有的唯一方法你的意见。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser && v != null) {
// initialize your view here and call you fetch_data_function()
}
答
这是我的解决方案,它按预期工作。在所有孩子的片段创建boolean
变量:
private boolean loadFragmentExecuted = false;
在孩子片段
创建一个名为loadFragment
通用的方法,并将所有你onCreateView
添加到该方法的逻辑:
public void loadFragment()
{
if(!loadFragmentExecuted)
{
//Add your logic to manipulate the UI or load data etc...
loadFragmentExecuted = true;
}
}
在您的浏览量逻辑创建片段动态,如:
//add the fragment
String fragmentName = "com.something." + fragmentId;
//check if the class exists
try
{
Class myFragmentClass = Class.forName(fragmentName);
Fragment myFragment = (Fragment) myFragmentClass.newInstance();
mFragments.add(myFragment);
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
catch (InstantiationException e)
{
e.printStackTrace();
}
然后设置您的寻呼机适配器和附加TA blayout与它:
//set our pager adapter that contains different fragments
mPagerAdapter = new BasePagerAdapter(mFragmentManager, mFragments);
//link the adapter to the viewpager
mViewPager.setAdapter(mPagerAdapter);
//cache fragments
int limit = (mPagerAdapter.getCount() > 0 ? mPagerAdapter.getCount() : 1);
mViewPager.setOffscreenPageLimit(limit);
//add the page listner to the viewPager and link it to the tabLayout
mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));
//on tab selected select current viewpager item
mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener()
{
@Override
public void onTabSelected(TabLayout.Tab tab)
{
mViewPager.setCurrentItem(tab.getPosition());
//get fragment for the selected tab
Fragment f = mPagerAdapter.getItem(tab.getPosition());
//load the content of the fragment
try
{
Class c = f.getClass();
Method loadFragment = c.getMethod("loadFragment");
loadFragment.invoke(f);
}
catch (IllegalAccessException e){}
catch (InvocationTargetException e){}
catch (NoSuchMethodException e){}
}
@Override
public void onTabUnselected(TabLayout.Tab tab)
{
}
@Override
public void onTabReselected(TabLayout.Tab tab)
{
}
});