Update data in ListFragment as part of ViewPager

后端 未结 10 1850
一整个雨季
一整个雨季 2020-11-22 07:55

I\'m using the v4 compatibility ViewPager in Android. My FragmentActivity has a bunch of data which is to be displayed in different ways on different pages in my ViewPager.

10条回答
  •  清酒与你
    2020-11-22 08:21

    You can copy FragmentPagerAdapter and modify some source code, add getTag() method

    for example

    public abstract class AppFragmentPagerAdapter extends PagerAdapter {
    private static final String TAG = "FragmentPagerAdapter";
    private static final boolean DEBUG = false;
    
    private final FragmentManager mFragmentManager;
    private FragmentTransaction mCurTransaction = null;
    private Fragment mCurrentPrimaryItem = null;
    
    public AppFragmentPagerAdapter(FragmentManager fm) {
        mFragmentManager = fm;
    }
    
    
    public abstract Fragment getItem(int position);
    
    @Override
    public void startUpdate(ViewGroup container) {
    }
    
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }
    
        final long itemId = getItemId(position);
    
    
        String name = getTag(position);
        Fragment fragment = mFragmentManager.findFragmentByTag(name);
        if (fragment != null) {
            if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
            mCurTransaction.attach(fragment);
        } else {
            fragment = getItem(position);
            if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
    
            mCurTransaction.add(container.getId(), fragment,
                    getTag(position));
        }
        if (fragment != mCurrentPrimaryItem) {
            fragment.setMenuVisibility(false);
            fragment.setUserVisibleHint(false);
        }
    
        return fragment;
    }
    
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }
        if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
                + " v=" + ((Fragment) object).getView());
        mCurTransaction.detach((Fragment) object);
    }
    
    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        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 finishUpdate(ViewGroup container) {
        if (mCurTransaction != null) {
            mCurTransaction.commitAllowingStateLoss();
            mCurTransaction = null;
            mFragmentManager.executePendingTransactions();
        }
    }
    
    @Override
    public boolean isViewFromObject(View view, Object object) {
        return ((Fragment) object).getView() == view;
    }
    
    @Override
    public Parcelable saveState() {
        return null;
    }
    
    @Override
    public void restoreState(Parcelable state, ClassLoader loader) {
    }
    
    
    public long getItemId(int position) {
        return position;
    }
    
    private static String makeFragmentName(int viewId, long id) {
        return "android:switcher:" + viewId + ":" + id;
    }
    
    protected abstract String getTag(int position);
    }
    

    then extend it, override these abstract method,don't need to be afraid of Android Group change

    FragmentPageAdapter source code in the future

     class TimeLinePagerAdapter extends AppFragmentPagerAdapter {
    
    
        List list = new ArrayList();
    
    
        public TimeLinePagerAdapter(FragmentManager fm) {
            super(fm);
            list.add(new FriendsTimeLineFragment());
            list.add(new MentionsTimeLineFragment());
            list.add(new CommentsTimeLineFragment());
        }
    
    
        public Fragment getItem(int position) {
            return list.get(position);
        }
    
        @Override
        protected String getTag(int position) {
            List tagList = new ArrayList();
            tagList.add(FriendsTimeLineFragment.class.getName());
            tagList.add(MentionsTimeLineFragment.class.getName());
            tagList.add(CommentsTimeLineFragment.class.getName());
            return tagList.get(position);
        }
    
    
        @Override
        public int getCount() {
            return list.size();
        }
    
    
    }
    

提交回复
热议问题