ViewPager混合添加xml布局和Fragment

第一篇技术博客,好紧脏

之前要修改源生音乐的一个UI界面,大换血,需要尽量整合源生的资源以利用来减少工作量和修改引起的bug。其中,新的UI设计中重新设计歌词显示和歌曲列表界面为左右滑动显示。但是,源生的歌词界面是一个xml布局文件,列表界面是通过继承公共类写好的Fragment。网上找了很多都是单独介绍怎么添加xml到ViewPager中,或者单独添加Fragment到ViewPager中,而且,Fragment的添加还有一个版本限制,好巧,我的这个源生音乐不是那个刚好的版本,两个文件如果自己重新定义很麻烦。所以,重点来了,我就自己研究了一下怎么将这两种不同的文件同时添加到ViewPager中。废话不多说了,捞干的。

private ArrayList<Object> pagers = new ArrayList<>();
private FrameLayout mLyricContentView;
private Fragment mFragment;

private void initViewPager(){
   mLyricContentView = (FrameLayout)getLayoutInflater().inflate(R.layout.lyric,null);
   pagers.add(mLyricContentView);
   mFragment = new TrackBrowserFragment();
   Bundle args = new Bundle();
   args.putString("playlist", "nowplaying");
   args.putBoolean("editValue", true);
   mFragment.setArguments(args);
   pagers.add(mFragment);
}

class ViewPagerAdapter extends PagerAdapter{
        private FragmentTransaction mCurTransaction = null;
        private FragmentManager mFragmentManger;
        private Fragment mCurrentPrimaryItem = null;
        Object mViews;

        ViewPagerAdapter(FragmentManager fm){
            mFragmentManger = fm;
        }

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

        public Fragment getItem(int position){
            Fragment fragment  = null;
            mViews = pagers.get(position);
            if(mViews instanceof Fragment){
                fragment = (Fragment) mViews;
            }
            return fragment;
        }

        @Override
        public void startUpdate(ViewGroup container) {
            if (container.getId() == View.NO_ID) {
                throw new IllegalStateException("ViewPager with adapter " + this
                        + " requires a view id");
            }
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            mViews = pagers.get(position);
            Object view = null;
            if(mViews instanceof View) {
                container.addView((View)mViews);
                view = (View)mViews;
            }else if(mViews instanceof Fragment){
                if (mCurTransaction == null) {
                    mCurTransaction = mFragmentManger.beginTransaction();
                }

                final long itemId = getItemId(position);

                String name = makeFragmentName(container.getId(), itemId);
                Fragment fragment = mFragmentManger.findFragmentByTag(name);
                if (fragment != null) {
                    Log.d(TAG, "Attaching item #" + itemId + ": f=" + fragment);
                    mCurTransaction.attach(fragment);
                } else {
                    fragment = getItem(position);
                    Log.d(TAG, "Adding item #" + itemId + ": f=" + fragment);
                    mCurTransaction.add(container.getId(), fragment,
                            makeFragmentName(container.getId(), itemId));
                }
                if (fragment != mCurrentPrimaryItem) {
                    fragment.setMenuVisibility(false);
                    fragment.setUserVisibleHint(false);
                }
                view = fragment;
            }
            return view;
        }

        @Override
        public void setPrimaryItem(ViewGroup container, int position, Object object) {
            mViews = pagers.get(position);
            if (!(mViews instanceof View)) {
                Fragment fragment = (Fragment) object;
                if (fragment != mCurrentPrimaryItem) {
                    if (mCurrentPrimaryItem != null) {
                        mCurrentPrimaryItem.setMenuVisibility(false);
                        mCurrentPrimaryItem.setUserVisibleHint(false);
                    }
                    if (fragment != null) {
                        fragment.setMenuVisibility(true);
                        fragment.setUserVisibleHint(true);
                    }
                    mCurrentPrimaryItem = fragment;
                }
            }
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            mViews = pagers.get(position);
            if(mViews instanceof View) {
                container.removeView((View)mViews);
            }else if(mViews instanceof Fragment) {
                if (mCurTransaction == null) {
                    mCurTransaction = getFragmentManager().beginTransaction();
                }
                mCurTransaction.detach((Fragment) object);
            }
        }

        @Override
        public void finishUpdate(ViewGroup container) {
            if (mCurTransaction != null) {
                mCurTransaction.commitNowAllowingStateLoss();
                mCurTransaction = null;
            }
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            boolean isViewFromObject = false;
            if(object instanceof View){
                isViewFromObject = view == object;
            }else if(object instanceof Fragment){
                isViewFromObject = ((Fragment)object).getView() == view;
            }
            return isViewFromObject;
        }

        public long getItemId(int position) {
            return position;
        }

        private String makeFragmentName(int viewId, long id) {
            return "android:switcher:" + viewId + ":" + id;
        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值