繁体   English   中英

带有 viewpager 的片段仅加载一次

[英]Fragment with viewpager load one time only

我有一个简单的问题.. 我有 MainActivity.. 在里面我有 5 个片段,我可以使用底部导航栏毫无问题地移动!

在第一个片段(配置文件)中,我在使用 Tablayout 和 Viewpager 的那个拖曳片段中......第一个片段(朋友)第二个片段(用户)..

当我运行应用程序并打开(配置文件)两个片段(朋友和用户)第一次工作 100% 时我的问题.. !

我想附上我的一些代码,你会需要它..

配置文件片段:

mSectionsPageAdapter = new 
SectionsPageAdapter(getActivity().getSupportFragmentManager());

mViewPager = (ViewPager) v.findViewById(R.id.container);

setupViewPager(mViewPager);

TabLayout tabLayout = (TabLayout) v.findViewById(R.id.tabs);

tabLayout.setupWithViewPager(mViewPager);

mSectionsPageAdapter.notifyDataSetChanged();

private void setupViewPager(ViewPager viewPager) {

SectionsPageAdapter adapter = new 
SectionsPageAdapter(getActivity().getSupportFragmentManager());

adapter.addFragment(new FriendsFragment(), "Friends");
adapter.addFragment(new UsersFragment(), "Online");

viewPager.setAdapter(adapter);
}

SectionsPageAdapter:

public class SectionsPageAdapter extends FragmentPagerAdapter {

private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();

public void addFragment(Fragment fragment, String title) {
    mFragmentList.add(fragment);
    mFragmentTitleList.add(title);
}

public SectionsPageAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public CharSequence getPageTitle(int position) {
    return mFragmentTitleList.get(position);
}

@Override
public Fragment getItem(int position) {
    return mFragmentList.get(position);
}

@Override
public int getCount() {
    return mFragmentList.size();
}}

我尝试在 Friends Fragment 和 Users Fragment 中添加这个问题解决了,但内容只在第一次运行时重复。

   @Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        getFragmentManager().beginTransaction().detach(this).attach(this).commit();

    }
}

SectionsPageAdapter:

public class SectionsPageAdapter extends FragmentPagerAdapter {

private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();

public void addFragment(Fragment fragment, String title) {
    mFragmentList.add(fragment);
    mFragmentTitleList.add(title);
}

public SectionsPageAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public CharSequence getPageTitle(int position) {
    return mFragmentTitleList.get(position);
}

@Override
public Fragment getItem(int position) {
    return mFragmentList.get(position);
}

@Override
public int getCount() {
    return mFragmentList.size();
}}

您可以使用接口来解决这个问题。 在“用户”和“朋友”片段中实现接口,并在调用“配置文件”片段“OnCreateView”时调用接口方法。 您可以在调用接口方法时加载数据。 作为参考,请查看此链接: 与其他片段通信

编辑

抱歉,您可以在不使用接口的情况下加载数据。 下面是一些示例代码:

配置文件片段:

ProfileFragment extends Activity  {
    FriendsFragment friends;
    UsersFragment users;
           @Override
           public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
                      mSectionsPageAdapter = new 
                      SectionsPageAdapter(getActivity().getSupportFragmentManager());

                      mViewPager = (ViewPager) v.findViewById(R.id.container);

                      setupViewPager(mViewPager);

                      TabLayout tabLayout = (TabLayout) v.findViewById(R.id.tabs);

                      tabLayout.setupWithViewPager(mViewPager);

                       mSectionsPageAdapter.notifyDataSetChanged();

                      friends.update();
                      users.update();
}

       private void setupViewPager(ViewPager viewPager) {

                       SectionsPageAdapter adapter = new 
                    SectionsPageAdapter(getActivity().getSupportFragmentManager());
                       friends = new FriendsFragment();
                       users = new UsersFragment();
                       adapter.addFragment(friends, "Friends");
                       adapter.addFragment(users, "Online");
                       viewPager.setAdapter(adapter);
    }

朋友片段:

FriendFragment extends Activity  {
    public void update(){
        // load data 
    }

您的问题的一个可能原因可能是您混淆了FragmentManager

在您的Activity中处理底部导航,您应该使用Activity#getSupportFragmentManager()

但是对于该活动中的任何Fragment ,如果您想拥有子/嵌套片段。 您应该使用Fragment#getChildFragmentManager()

因此,在您的个人资料片段中,在填充两个选项卡寻呼机时,您应该传递它Fragment#getChildFragmentManager()而不是getActivity().getSupportFragmentManager()

玩笑 使用

ViewPagerAdapter(getChildFragmentManager())
  • getChildFragmentManager()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM