简体   繁体   English

带有 viewpager 的片段仅加载一次

[英]Fragment with viewpager load one time only

I have simple problem.. I have MainActivity.. inside it i have 5 fragments and i can move using bottom navigation bar without problem!我有一个简单的问题.. 我有 MainActivity.. 在里面我有 5 个片段,我可以使用底部导航栏毫无问题地移动!

In first fragment (Profile) i have inside that tow fragment using Tablayout and Viewpager.. First Fragment (Friends) Second Fragment (Users)..在第一个片段(配置文件)中,我在使用 Tablayout 和 Viewpager 的那个拖曳片段中......第一个片段(朋友)第二个片段(用户)..

My problem when i run app and open (Profile) the tow fragments (Friends and Users) Working 100% just in first time.. when i come back to other fragment using bottom bar and come back to friends or users is empty and not load !当我运行应用程序并打开(配置文件)两个片段(朋友和用户)第一次工作 100% 时我的问题.. !

I want attach some of my codes you will need it..我想附上我的一些代码,你会需要它..

Profile Fragment:配置文件片段:

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: 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();
}}

I try to add this in Friends Fragment and Users Fragment the problem was solved but the content duplicated in first time run only.我尝试在 Friends Fragment 和 Users Fragment 中添加这个问题解决了,但内容只在第一次运行时重复。

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

    }
}

SectionsPageAdapter: 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();
}}

You can use interface to solve this problem.您可以使用接口来解决这个问题。 Implement interface in your "User" & "Friend" fragments & call the interface method when your "Profile" fragments "OnCreateView" is called.在“用户”和“朋友”片段中实现接口,并在调用“配置文件”片段“OnCreateView”时调用接口方法。 You can load data when interface method is called.您可以在调用接口方法时加载数据。 For reference, Please check this link: Communicating with Other Fragments作为参考,请查看此链接: 与其他片段通信

EDIT编辑

Sorry,you can load data without using Interface.抱歉,您可以在不使用接口的情况下加载数据。 Here is some sample code:下面是一些示例代码:

Profile Fragment:配置文件片段:

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);
    }

Friends Fragment:朋友片段:

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

A possible reason for your problems could be you are mixing up FragmentManager s.您的问题的一个可能原因可能是您混淆了FragmentManager

In your Activity to handle the bottom navigation you should use Activity#getSupportFragmentManager() .在您的Activity中处理底部导航,您应该使用Activity#getSupportFragmentManager()

But for any of the Fragment s inside that activity, if you want to have children/nested fragments.但是对于该活动中的任何Fragment ,如果您想拥有子/嵌套片段。 You should use Fragment#getChildFragmentManager() .您应该使用Fragment#getChildFragmentManager()

So in your profile fragment, while populating the two tabs pager, you should pass it Fragment#getChildFragmentManager() instead of getActivity().getSupportFragmentManager()因此,在您的个人资料片段中,在填充两个选项卡寻呼机时,您应该传递它Fragment#getChildFragmentManager()而不是getActivity().getSupportFragmentManager()

jest Use玩笑 使用

ViewPagerAdapter(getChildFragmentManager())
  • getChildFragmentManager() getChildFragmentManager()

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

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