ViewPager嵌套Fragment实现item实时更新的两种方式

来源:互联网 发布:模具分析软件 编辑:程序博客网 时间:2024/06/10 00:56

ViewPager嵌套Fragment实现item实时更新的两种方式


引言

很多项目中需要viewpager嵌套多个fragment实现切换的这种大框架,但是效果实现简单,想要实现item里数据实时更新往往让人头疼,今天小编分享两个方法实现这种效果,当然,方法很多,重在分享。


可能涉及到这一类问题,往往程序员第一想到的是fragment的生命周期,利用onResume方法实现数据更新,但是嵌入到ViewPager中,其自带的预加载功能可能阻碍了我们实现某些功能,比如说每切换到一个页面想要实现一个动画效果,这样利用生命周期是不能实现的,因为在此之前fragment的生命周期已经提前执行了。好了,开始我的分享。


第一种方法:onPageScrollStateChanged()

我们知道ViewPager提供的onPageScrollStateChanged()方法自带三个int类型参数,分别为0(静止状态)、1(开始滑动,滑动进行时)、2(滑动结束)。我们可以根据需求利用这三个参数对动画效果以及数据进行更新操作,下面我已一个动画效果进行说明。

    //动画集    private AnimationSet MyAnimationSet(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta){        alphaAnimation = new AlphaAnimation(0, 1.0f);          scaleAnimation = new ScaleAnimation(0f, 1.0f,0.1f,1.0f);         TranslateAnimation animation = new TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);        animation.setInterpolator(new OvershootInterpolator());        AnimationSet set = new AnimationSet(true);          set.addAnimation(animation);          set.addAnimation(alphaAnimation);         set.addAnimation(scaleAnimation);        set.setDuration(1000);          set.setFillAfter(true);        return set;    }
    //从0累加线程进度动画    runnable = new Runnable() {        @Override        public void run() {        // TODO Auto-generated method stub        for(float i=0;i<=j+0.01;i=(float) (i+0.01)){            if(tag==1){                view_circlehomepager.setProgressNotInUiThread(i);            }else{                view_circlehomepager1.setProgressNotInUiThread(i);            }          }        }    };
    //开始动画效果    public void AllAnimation(){        StartAnimationSet();        new Thread(runnable).start();    }
    @Override    public void onPageScrollStateChanged(int arg0) {//实现切换fragment执行动画    if (arg0 == 2) {//arg0==2表示滑动结束         CircleHomePager1.AllAnimation();//第一个fragment执行界面更新操作         CircleHomePager2.AllAnimation();//第二个fragment执行界面更新操作         CircleHomePager3.AllAnimation();//第三个fragment执行界面更新操作        }    }

第二种方法重写Fragment的setUserVisibleHint(boolean isVisibleToUser)方法


通过查看Fragment官方API我们知道setUserVisibleHint(boolean isVisibleToUser)方法先于onCreate()方法执行,意思是当我们的Fragment可见的时候执行该方法,不管viewpager是否预加载,所以我们利用此特性可以达到我们想要实现的效果。同样,我来执行上述动画效果。

    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {//初始化布局        // TODO Auto-generated method stub        if (rootView == null) {            rootView = inflater.inflate(R.layout.fragment_circlehomepager1,container, false);            initview(rootView);//绑定UI操作        }        ViewGroup parent = (ViewGroup) rootView.getParent();        if (parent != null) {            parent.removeView(rootView);        }        return rootView;    }
    @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if(rootView!=null){            initview(rootView);//绑定UI操作            if(isVisibleToUser==true){                    AllAnimation();//执行该Fragment的动画效果            }else{                    stopAnimation();//不可见时停止动画效果            }        }    }

结束

以上两种简单方法是否完美的解决了你的问题呢,记得那句话有说,方法很多,只有你想不到的没有你做不到的。所以,加油吧,各位。如果还有任何疑问,欢迎留言。

0 0
原创粉丝点击