zoukankan      html  css  js  c++  java
  • 巧力避免ViewPager的预加载数据,Tablayout+Fragment+viewPager



    问题描述

    最近在进行一个项目的开发,其中使用到了Tablayout+Fragment+viewPager来搭建一个基本的框架,从而出现了设置数据适配器的时候,item的位置错乱问题。我打印log日志的时候发现原来是,设置了两次数据数据适配器,考虑到ViewPager的预加载数据问题,我就想到了问题出现了在这里。当我加载第一个tablayout的tab的时候,第二个tab的数据已经初始化完毕了,从而导致了数据适配器设置了两次的问题,也就出现了数据错乱的问题。

    解决方案

    我使用了下面的方法就解决了问题。

    在ViewPager初始化的时候对ViewPager进行监听事件


       //设置监听事件
            viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
                }
    
                @Override
                public void onPageSelected(int position) {
                    //选中
                   // 当该页面选中时,才开始初始化当前页面的数据
      mFragmentsLists.get(position).initData(); } @Override public void onPageScrollStateChanged(int state) { } });
    
    //默认初始化第一页的数据
    mFragmentsLists.get(0).initData();
    
    上面的代码片中,viewPager就是初始化的viewpager的控件,mFragmentsLists就是我们要显示的中部的Fragment集合
    对Viewpager设置了监听事件,当那一页被选中就初始化哪一页的数据,从而避免了ViewPager预加载数据问题。
    Fragment中的代码片段:
      // Fragment填充布局
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
           //在这里初始化Fragment的布局
                     //但是不要初始化数据,不要在Fragment创建的时候调用initData()方法,等着外界数据调用
            return view;
        }
    Fragment中的initData()方法:
        /**
         * 初始化数据
         */
        public void initData() {
            //所有初始化数据的操作都在这里进行
        }
    
    我这样就解决了我的问题。




  • 相关阅读:
    【转发】淘宝下单高并发解决方案
    ImageLoader的使用
    学习写接口回调
    EventBus的使用
    ListView显示多种类型的item
    GridView规则显示图片
    ViewPager滑动标签-PagerSlidingTabStrip的使用
    Json解析要点
    LISTVIEW嵌套GRIDVIEW的一些处理(点击GRIDVIEW的条目,能够显示他在LISTVIEW中的位置)(对这篇文章的优化处理,不每次都new onItemClickListener)
    SVN分支的创建,合并,与销毁和相关操作
  • 原文地址:https://www.cnblogs.com/shaofeer/p/11154441.html
Copyright © 2011-2022 走看看