zoukankan      html  css  js  c++  java
  • AndroidImageSlider第一张图闪过的问题解决

    1. AndroidImageSlider的使用:

    参考源码:https://github.com/daimajia/AndroidImageSlider

    当然网上介绍使用方法的很多,搜一搜。

    2. 遇到的第一张闪过问题解决(其实我在想直接换一个其他的使用不久得了,但还是先解决了,再换)

    * 导致这种问题的原因:(原因可能不是很详细,直接跳过看解决就好)

      在布局中使用SliderLayout,这样在数据未加载完成时,已经创建了对象。经过一番排查发现问题实在这里:

    public SliderLayout(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            mContext = context;
            LayoutInflater.from(context).inflate(R.layout.slider_layout, this, true);
    
            final TypedArray attributes = context.getTheme().obtainStyledAttributes(attrs,R.styleable.SliderLayout,
                    defStyle,0);
    
            mTransformerSpan = attributes.getInteger(R.styleable.SliderLayout_pager_animation_span, 1100);
            mTransformerId = attributes.getInt(R.styleable.SliderLayout_pager_animation, Transformer.Default.ordinal());
            mAutoCycle = attributes.getBoolean(R.styleable.SliderLayout_auto_cycle,true);
            int visibility = attributes.getInt(R.styleable.SliderLayout_indicator_visibility,0);
            for(PagerIndicator.IndicatorVisibility v: PagerIndicator.IndicatorVisibility.values()){
                if(v.ordinal() == visibility){
                    mIndicatorVisibility = v;
                    break;
                }
            }
            mSliderAdapter = new SliderAdapter(mContext);
            PagerAdapter wrappedAdapter = new InfinitePagerAdapter(mSliderAdapter);
    
            mViewPager = (InfiniteViewPager)findViewById(R.id.daimajia_slider_viewpager);
            mViewPager.setAdapter(wrappedAdapter);
    
            mViewPager.setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    int action = event.getAction();
                    switch (action) {
                         case MotionEvent.ACTION_UP:
                            recoverCycle();
                            break;
                    }
                    return false;
                }
            });
    
            attributes.recycle();
            setPresetIndicator(PresetIndicators.Center_Bottom);
            setPresetTransformer(mTransformerId);
            setSliderTransformDuration(mTransformerSpan,null);
            setIndicatorVisibility(mIndicatorVisibility);
            if(mAutoCycle){
                startAutoCycle();
            }
        }
    

      创建了对象,就已经设置了Adapter,网络加载数据,导致时间延迟,加载完成,再设置Adapter时,会引发 ViewPagerEx 中的一个 PagerObserver 中的 onChanged() 方法引起的,具体是可以去看一下源码。了解了如何造成的,然并卵。直接 compile 进来的,你改不了源码。只能退而求其次。

    * 解决方法:

    我在加载完数据时再创建SliderLayout对象,进行数据填充,问题就解决了。这样就需要动态创建对象,并添加在相应的位置。之前那个位置,就可以用一个容器来代替。看代码:

    private void initSliderLayout(List<PromotionsBean> promotionList) {
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            sliderLayout = new SliderLayout(getContext());
            sliderLayout.setLayoutParams(params);
            sliderLayout.requestLayout();
            for (int i = 0; i < promotionList.size(); i++) {
                final PromotionsBean promotionsBean = promotionList.get(i);
                DefaultSliderView textSliderView = new DefaultSliderView(getContext());
    //            textSliderView.description(item.getInfo());//标题
                textSliderView.image(promotionsBean.getImage());//加载图片
                textSliderView.setOnSliderClickListener(new BaseSliderView.OnSliderClickListener() {
                    @Override
                    public void onSliderClick(BaseSliderView slider) {
                        Intent intent = new Intent(getContext(), WRTWebActivity.class);
                        intent.setAction(promotionsBean.getLink());
                        startActivity(intent);
                    }
                });
                sliderLayout.addSlider(textSliderView);
            }
            bannerRoot.addView(sliderLayout, 0); //bannerRoot 为容器
            sliderLayout.startAutoCycle(4000, 4000, true);
        }
    

      

  • 相关阅读:
    记一次百度面试题
    深度拷贝对象
    spring boot 学习笔记
    mac Zip 常用命令
    Mac OS 终端下使用 Curl 命令下载文件
    懒人必备的移动端定宽网页适配方案
    前端面试题之 sum(2)(3) (链式调用,toString,柯里化,数组操作)
    web上的复制
    fileupload上传文件时带参数
    Mac下Nginx环境配置
  • 原文地址:https://www.cnblogs.com/aimqqroad-13/p/7743180.html
Copyright © 2011-2022 走看看