ViewPager+Fragment取消预加载(实现只加载一页的效果)

来源:互联网 发布:js解除绑定click事件 编辑:程序博客网 时间:2024/04/28 19:35

取消Fragment的预加载,只有用户切换到某个Fragment才加载当前的界面

setUserVisibleHint(boolean isVisibleToUser)、 设置Fragment可见状态
boolean getUserVisibleHint(), 获得Fragment可见状态

写一个父类继承Fragment , 在上面两个方法中做判断

代码如下:

public abstract class BaseFragment extends Fragment {    /** Fragment当前状态是否可见 */    protected boolean isVisible;    @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if(getUserVisibleHint()) {            isVisible = true;            onVisible();        } else {            isVisible = false;            onInvisible();        }    }    /**     * 可见     */    protected void onVisible() {        lazyLoad();         }    /**     * 不可见     */    protected void onInvisible() {    }    /**      * 延迟加载     * 定义成抽象的这样子类必须重写此方法     */    protected abstract void lazyLoad();}

在Fragment中,继承这个类,然后重写其中的lazyLoad()方法,当Fragment对用户可见(即用户切换到此Fragment时)我们在lazyLoad()中加载所需数据即可

 public class HomeFragment extends BaseFragment {        private static final String FRAGMENT_INDEX = fragment_index;        private final int FIRST_FRAGMENT = 0;        private final int SECOND_FRAGMENT = 1;        private final int THIRD_FRAGMENT = 2;        private TextView mFragmentView;        private int mCurIndex = -1;        /** 标志位,标志已经初始化完成 */        private boolean isPrepared;        /** 是否已被加载过一次,第二次就不再去请求数据了 */        private boolean mHasLoadedOnce;        /**         * 创建新实例         *         * @param index         * @return         */        public static HomeFragment newInstance(int index) {            Bundle bundle = new Bundle();            bundle.putInt(FRAGMENT_INDEX, index);            HomeFragment fragment = new HomeFragment();            fragment.setArguments(bundle);            return fragment;        }        @Override        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {            if(mFragmentView == null) {                mFragmentView = (TextView) inflater.inflate(R.layout.fragment, container, false);                //获得索引值                Bundle bundle = getArguments();                if (bundle != null) {                    mCurIndex = bundle.getInt(FRAGMENT_INDEX);                }                isPrepared = true;                lazyLoad();            }            //因为共用一个Fragment视图,所以当前这个视图已被加载到Activity中,必须先清除后再加入Activity            ViewGroup parent = (ViewGroup)mFragmentView.getParent();            if(parent != null) {                parent.removeView(mFragmentView);            }            return mFragmentView;        }        @Override        protected void lazyLoad() {            if (!isPrepared || !isVisible || mHasLoadedOnce) {                return;            }            new AsyncTask<void, boolean="">() {                @Override                protected void onPreExecute() {                    super.onPreExecute();                    //显示加载进度对话框                    UIHelper.showDialogForLoading(getActivity(), 正在加载..., true);                }                @Override                protected Boolean doInBackground(Void... params) {                    try {                        Thread.sleep(2000);                        //在这里添加调用接口获取数据的代码                        //doSomething()                    } catch (Exception e) {                        e.printStackTrace();                    }                    return true;                }                @Override                protected void onPostExecute(Boolean isSuccess) {                    if (isSuccess) {                        // 加载成功                        setView();                        mHasLoadedOnce = true;                    } else {                        // 加载失败                    }                    //关闭对话框                    UIHelper.hideDialogForLoading();                }            }.execute();        }        private void setView() {            // 根据索引加载不同视图            switch (mCurIndex) {                case FIRST_FRAGMENT:                    mFragmentView.setText(第一个);                    break;                case SECOND_FRAGMENT:                    mFragmentView.setText(第二个);                    break;                case THIRD_FRAGMENT:                    mFragmentView.setText(第三个);                    break;            }        }      }

在FragmentActivity中对ViewPager设置一下,让它每次只加载一个Fragment,ViewPager.setOffscreenPageLimit(int limit),其中参数可以设为0或者1,参数小于1时,会默认用1来作为参数,未设置之前,ViewPager会默认加载两个Fragment。所以,我们只需要调用下它,设置下加载Fragment个数即可。

public class MainActivity extends FragmentActivity implements OnClickListener{    private RadioButton mFstBtn;    private RadioButton mSndBtn;    private RadioButton mThdBtn;    private ViewPager mViewPager;    private ListFragmentPagerAdapter mPagerAdapter;    private List<fragment> mFragments = new ArrayList<fragment>();    private final int FIRST_FRAGMENT = 0;    private final int SECOND_FRAGMENT = 1;    private final int THIRD_FRAGMENT = 2;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initButton();        initViewPager();    }    /**     * 初始化按钮     */    private void initButton() {        mFstBtn = (RadioButton)findViewById(R.id.id_rb_fst);        mFstBtn.setOnClickListener(this);        mSndBtn = (RadioButton)findViewById(R.id.id_rb_snd);        mSndBtn.setOnClickListener(this);        mThdBtn = (RadioButton)findViewById(R.id.id_rb_thd);        mThdBtn.setOnClickListener(this);    }    /**     * 初始化ViewPager控件     */    private void initViewPager() {        mViewPager = (ViewPager)findViewById(R.id.id_vp_viewpager);        //关闭预加载,默认一次只加载一个Fragment        mViewPager.setOffscreenPageLimit(1);        //添加Fragment        mFragments.add(CustomListFragment.newInstance(FIRST_FRAGMENT));        mFragments.add(CustomListFragment.newInstance(SECOND_FRAGMENT));        mFragments.add(CustomListFragment.newInstance(THIRD_FRAGMENT));        //适配器        mPagerAdapter = new ListFragmentPagerAdapter(getSupportFragmentManager(), mFragments);        mViewPager.setAdapter(mPagerAdapter);        mViewPager.setOnPageChangeListener(onPageChangeListener);    }    private OnPageChangeListener onPageChangeListener = new OnPageChangeListener() {        @Override        public void onPageSelected(int position) {            //根据用户选中的按钮修改按钮样式            switch (position) {            case FIRST_FRAGMENT:                mFstBtn.setChecked(true);                mSndBtn.setChecked(false);                mThdBtn.setChecked(false);                break;            case SECOND_FRAGMENT:                mFstBtn.setChecked(false);                mSndBtn.setChecked(true);                mThdBtn.setChecked(false);                break;            case THIRD_FRAGMENT:                mFstBtn.setChecked(false);                mSndBtn.setChecked(false);                mThdBtn.setChecked(true);            break;            }        }        @Override        public void onPageScrolled(int arg0, float arg1, int arg2) {}        @Override        public void onPageScrollStateChanged(int arg0) {}    };    @Override    public void onClick(View v) {        switch (v.getId()) {        case R.id.id_rb_fst:            mViewPager.setCurrentItem(FIRST_FRAGMENT);            break;        case R.id.id_rb_snd:            mViewPager.setCurrentItem(SECOND_FRAGMENT);            break;        case R.id.id_rb_thd:            mViewPager.setCurrentItem(THIRD_FRAGMENT);            break;        }    }}通过上诉逻辑 就可实现 加载一页的效果  当需要其他页的时候在点击加载其他页的数据 即可安卓学习交流群 : 595856941
0 0
原创粉丝点击