碎片不会每次刷新/调用

时间:2015-11-10 16:33:55

标签: java android android-fragments

不知怎的,我的Fragment每次都没有被调用。

这是问题
我有3个标签,如此。

-------------------------------------
|Fragment1   Fragment2   Fragment3  |
|                                   |
|                                   |
|                                   |
-------------------------------------

每当我点击 Fragment1 然后 Fragment3 时, Fragment3 onCreateView就会被调用。但是,当我点击 Fragment2 然后 Fragment3 时,它就没有了。

我正在使用扩展TabsPagerAdapter

的自定义FragmentPagerAdapter

以下是必需的代码段。 (如果您需要查看更多代码,请告诉我)。 的 TabsPagerAdapter

    public class TabsPagerAdapter extends FragmentPagerAdapter {
    private String[] tabs = { "Fragment1", "Fragment2", "Fragment3" };
    List<Fragment> fragments;



    public TabsPagerAdapter(FragmentManager fm, List<TabsPagerAdapter> fragments) {
        super(fm);
        this.fragments = fragments;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return tabs[position];
    }

    @Override
    public Fragment getItem(int index) {
        return fragments.get(index);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
            String tag = createdFragment.getTag();
        return createdFragment;
    }

    @Override
    public int getCount() {
        // get item count - equal to number of tabs
        return fragments.size();
    }

}

Fragment3:

public class Fragment3 extends Fragment {
 @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.context = context;
    }
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        context=activity;
    }

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
          ......
         Log.i("Blocked List","onCreateView called"); //This doesn't print
                                                      //sometimes
          getList();//It holds the list for ListView

  }

Fragment1几乎与Fragment2Fragment3相似。

帮助!

2 个答案:

答案 0 :(得分:1)

我的解决方案使用片段覆盖方法,该方法仅在片段在ViewPager中可见时触发

 @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            if(isVisibleToUser) {
                //fragment visible code
            }
            else{
            //fragment invisible code
              }
        }

答案 1 :(得分:0)

使用此解决方案,每次调用getItem()时,都会创建一个新的Fragment。您可以尝试懒惰地实例化片段(即在数组或集合中),然后在需要时返回它们。

请注意,您需要传入片段列表,而不是适配器。

在我的项目中,我使用通常有效的代码

public ProfilePagesAdapter(@NonNull FragmentManager fm,
                            @NonNull List<Fragment> fragments) {
    super(fm);
    this.fragments = fragments;
}

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

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

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