解決viewpager+fragment+tablayout的動態重新整理

道理我都農發表於2018-05-14

在開發專案中的時候大多我們為了方便就會使用第三方的控制元件,而在開發的時候相信大家對fragmen的遇到的坑不少吧,今天就為大家講解viewpager+fragment+tablayout如何動態的更新資料:

而在此處我提供兩種方法供大家參考:

1:暴力重新整理:你要動態重新整理資料,在FragmentPagerAdapter中必須實現此方法,並且只能在這個方法裡,不能是getItem。否則呼叫notifyDataSetChanged就沒有效果,

 if (pagerAdapter == null) {
            pagerAdapter = new NoScrollViewPagerAdapter(getChildFragmentManager());//繼承FragmentPagerAdapter
        }
        mViewpager.setAdapter(pagerAdapter);
        mViewpager.setOffscreenPageLimit(1);
        tab.setViewPager(mViewpager);
        if (isRefresh) {//是否強制重新整理,此處做判斷
            pagerAdapter.setNewFragments();//這是我在FragmentPagerAdapter中定義的重新整理方法,

        }
private class NoScrollViewPagerAdapter extends FragmentPagerAdapter {
        private List<String> tags;//標示fragment的tag
        private FragmentManager fragmentManager;

        NoScrollViewPagerAdapter(FragmentManager fm) {
            super(fm);
            this.tags = new ArrayList<>();
            this.fragmentManager = fm;
        }
        //Fragment的例項化工作
        @Override
        public Fragment getItem(int position) {
            return SortFragment.getInstance(categoryList.get(position).getDictSn(), Fragment.GRABORDER);
        }

        @Override
        public int getCount() {
            return categoryList.size();
        }
 
        @Override
        public CharSequence getPageTitle(int position) {
            return categoryList.get(position).getName();
        }

        //返回PagerAdapter.POSITION_NONE保證呼叫notifyDataSetChanged重新整理Fragment。
        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;//必須返回的是POSITION_NONE,否則不會重新整理

        }
        //這個就不說了
        private String makeFragmentName(int viewId, long id) {
            return "android:switcher:" + viewId + ":" + id;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            super.destroyItem(container, position, object);
        }
        //必須重寫此方法,新增tag一一做記錄
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            tags.add(makeFragmentName(container.getId(), getItemId(position)));
            Fragment fragment = (Fragment) super.instantiateItem(container, position);
            this.fragmentManager.beginTransaction().show(fragment).commit();
            return fragment;
        } 
        //根據tag查詢快取的fragment,移除快取的fragment,替換成新的
        public void setNewFragments() {
            if (this.tags != null) {
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                for (int i = 0; i < tags.size(); i++) {
                    fragmentTransaction.remove(fragmentManager.findFragmentByTag(tags.get(i)));
                }
                fragmentTransaction.commit();
                fragmentManager.executePendingTransactions();
                tags.clear();
            }
            notifyDataSetChanged();
        }
    }

2: 最笨的方法你可以在生命週期中做判斷,哈哈,一般不會這樣做的,除非你實在是沒有辦法了

其實還有一種我就不講了,相信第一種方法已經可以滿足你了,註釋已經十分詳細了,如果還有什麼不懂得歡迎留言,一起探討。

部落格雖短,十分精華,歡迎留言! 》-《


相關文章