带有viewpager的片段只加载一次

时间:2018-05-14 08:51:12

标签: java android android-layout android-fragments

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

在第一个片段(Profile)中,我使用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();
}}

3 个答案:

答案 0 :(得分:0)

您可以使用界面来解决此问题。在您的&#34;用户&#34;中实现界面&安培; &#34;朋友&#34;碎片&amp;当您的&#34;个人资料&#34;片段&#34; OnCreateView&#34;叫做。您可以在调用interface方法时加载数据。供参考,请检查此链接: Communicating with Other Fragments

修改

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

个人资料片段:

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 
    }

答案 1 :(得分:0)

玩笑

ViewPagerAdapter(getChildFragmentManager())
  • <块引用>

    getChildFragmentManager()

答案 2 :(得分:-1)

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

Activity处理底部导航时,您应使用Activity#getSupportFragmentManager()

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

因此,在您的个人资料片段中,在填充两个标签页面框时,您应该将其传递给Fragment#getChildFragmentManager()而不是getActivity().getSupportFragmentManager()