AndroidImageSlider第一张图闪过的问题解决
1. AndroidImageSlider的使用:
参考源码:https://github.com/daimajia/AndroidImageSlider
当然网上介绍使用方法的很多,搜一搜。
2. 遇到的第一张闪过问题解决(其实我在想直接换一个其他的使用不久得了,但还是先解决了,再换)
* 导致这种问题的原因:(原因可能不是很详细,直接跳过看解决就好)
在布局中使用SliderLayout,这样在数据未加载完成时,已经创建了对象。经过一番排查发现问题实在这里:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 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对象,进行数据填充,问题就解决了。这样就需要动态创建对象,并添加在相应的位置。之前那个位置,就可以用一个容器来代替。看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 ); } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步