美文网首页
ViewPager Fragment

ViewPager Fragment

作者: adrecen | 来源:发表于2016-10-29 23:29 被阅读26次

    最近,遇到了一个问题。
    业务需求是这样,需要三个tab,分别显示三个页面,
    1.三个页面分别请求不同的数据。
    2.主页面中提供排序功能,点击后刷新三个页面
    3.每个Fragment可以单独刷新
    而每次请求数据时,不会重新执行Fragment中的代码。因为在FragmentStatePagerAdapter中,会去查询FragmenManager中的Fragment,如果其中存在待查询Fragment的实例,那么就执行实例,而不会重新初始化。
    这里采取的方案就是,清理FragmentManager中的实例,这样每次刷新时都会进行初始化。传入相应参数进行相应的操作。由于这里只有三个页面,每次重新初始化,不会有很大的性能损失。
    主要的代码在Adapter中,

    public class FragmentAdapter extends FragmentStatePagerAdapter {
        private List<Fragment> mFragments;
        private List<String> mTitles;
        private FragmentManager fm;
        private List<String> mTagList = new ArrayList<>();
        private boolean[] fragmentsUpdateFlag = { false, false, false, false };
    
        public FragmentAdapter(FragmentManager fm, List<Fragment> fragments, List<String> titles) {
            super(fm);
            this.fm = fm;
            mFragments = fragments;
            mTitles = titles;
        }
    
        @Override
        public Fragment getItem(int position) {
            return mFragments.get(position);
        }
    
        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
            //POSITION_NONE 表示item不显示了
            //POSITION_UNCHANGED 表示item的位置没有改变,默认返回
        }
    
        @Override
        public int getCount() {
            return mFragments.size();
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            return mTitles.get(position);
        }
    
        public void updateData(List<Fragment> fragments){
            setFragments(fragments);
        }
    
        //设置载入的Fragment
        private void setFragments(List<Fragment> mFragments){
            if (this.mFragments != null){
                //清理Fragment中的缓存
                FragmentTransaction fragmentTransaction = fm.beginTransaction();
                for (Fragment f : this.mFragments){
                    fragmentTransaction.remove(f);
                }
                fragmentTransaction.commit();
                fm.executePendingTransactions();
            }
            this.mFragments = mFragments;
            notifyDataSetChanged();
        }
    }
    

    相关文章

      网友评论

          本文标题:ViewPager Fragment

          本文链接:https://www.haomeiwen.com/subject/mlmyuttx.html