美文网首页
View Pager和TableLayout联动多个Fragme

View Pager和TableLayout联动多个Fragme

作者: 资本家大恶人 | 来源:发表于2020-08-20 15:03 被阅读0次
  • 使用FragmentStatePagerAdapter

相同点:
两者都会保持当前item(即fragment)和前后的item的状态。
显示当前item的同时,Adapter会提前初始化后一个item,并把当前item的前一个item保存在内存中。

不同点:
在于fragment 存储、恢复、销毁 的方式不同

对滑动过去的页面是否销毁:
例如:依次从左向右有fragment1,fragment2,fragment3三个页面

FragmentPagerAdapter在滑动到fragment3时,fragment1会依次调用onPause()、onStop()、onDestroyView(),再向左滑动到fragment2时,fragment1会调用onCreateView()、onActivityCreated()、onStart()、onResume()。
结论:FragmentPagerAdapter会保留页面的状态,并不会完全销毁掉。

FragmentStatePagerAdapter在滑动到fragment3时,fragment1会依次调用onPause()、onStop()、onDestroyView()、onDestroy()、onDetach()方法,再向左滑动到fragment2时,fragment1会调用onAttach()、onCreate()、onCreateView()、onActivityCreated()、onStart()、onResume()。
结论:FragmentStatePagerAdapter会完全销毁滑动过去的item,当需要初始化的时候,会重新初始化页面。

如何选择?
当Viewpager中fragment数量多的时候用FragmentStatePagerAdapter,反之则用FragmentPagerAdapter

实例代码

   
// 创建FragmentStatePagerAdapter
    
    public class NewsAdapter extends FragmentStatePagerAdapter {
//        设置数据
        private ArrayList<ColumnData.Column> mData;

        public NewsAdapter(@NonNull FragmentManager fm, ArrayList<ColumnData.Column> data) {
            super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
            mData = data;
        }

        @NonNull
        @Override
        public Fragment getItem(int position) {
//            用到哪个Fragment就创建那个Fragment
            return PageFragment.newInstance(mData.get(position).getId(), mData.get(position).getName());
        }
//     根据数据集合得到要创建的Fragment的数量
        @Override
        public int getCount() {
            return mData == null ? 0 : mData.size();
        }
//     设置title让ViewPager与Tablelayout连动
        @Nullable
        @Override
        public CharSequence getPageTitle(int position) {
            return mData.get(position).getName();
        }
//       创建方法得到该适配器数据
        public ArrayList<ColumnData.Column> getmData() {
            return mData;

        }
    }

被多次创建的Fragment中(PageFragment)

public class PageFragment extends BaseSmartFramgent1<RecommendData> {
 /**
     * 
     * @param cloumId 得到ID获取不同页面的数据
     * @param name
     * @return
     * 创建静态的方法返回创建好的Fragment
     */
    public static PageFragment newInstance(String cloumId, String name) {
//        创建Fragment
        PageFragment pageFragment = new PageFragment();
//        使用Bundle传入数据
        Bundle bundle = new Bundle();
        bundle.putString(NAME, name);
        bundle.putString(KEY_CLOUMID, cloumId);
//        
        pageFragment.setArguments(bundle);
        return pageFragment;
    }
//  因为newInstance是静态方法无法直接访问通过setArguments得到数据
    @Override
    public void setArguments(@Nullable Bundle args) {
        super.setArguments(args);
        if (args != null) {

            mCloum = args.getString(KEY_CLOUMID);

        }

    }
}

使用

//            得到数据
             ArrayList<ColumnData.Column> myColumn = data.getData().getList().getMyColumn();
            mNewsAdapter = new NewsAdapter(getChildFragmentManager(), myColumn);
//            设置进入适配器
            binding.recoomendVp.setAdapter(mNewsAdapter);
//            tablayout与ViewPager连动
            binding.recommendSlidingTabLayout.setViewPager(binding.recoomendVp);

相关文章

网友评论

      本文标题:View Pager和TableLayout联动多个Fragme

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