wenchaosong / Banner

轮播图控件,支持自定义布局,支持两端缩进,类似卡片,支持无限循环和多种主题,可以灵活设置轮播样式、动画、轮播和切换时间、位置、图片加载框架等!
Apache License 2.0
530 stars 73 forks source link

如果原来有数据,后来update size 为0 时 会报错 #29

Closed ZTFtrue closed 5 years ago

ZTFtrue commented 5 years ago

目前我是放一个size为1的数据

 “”
wenchaosong commented 5 years ago

@ZTFtrue 我试了一下,只有 null 的时候才报错,如果是 0 是不会有问题的

ZTFtrue commented 5 years ago
java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 5000, found: 0 Pager id: com.ms.banner.view.BannerViewPager Problematic adapter: class com.ms.banner.Banner$BannerPagerAdapter
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1143)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1092)
    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1622)
    at android.view.View.layout(View.java:19768)
    at android.view.ViewGroup.layout(ViewGroup.java:6144)
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)
    at android.view.View.layout(View.java:19781)
    at android.view.ViewGroup.layout(ViewGroup.java:6144)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:325)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:19781)
    at android.view.ViewGroup.layout(ViewGroup.java:6144)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1816)
    at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1805)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1571)
    at android.view.View.layout(View.java:19781)
    at android.view.ViewGroup.layout(ViewGroup.java:6144)
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)
    at android.view.View.layout(View.java:19781)
    at android.view.ViewGroup.layout(ViewGroup.java:6144)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1816)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1660)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1569)
    at android.view.View.layout(View.java:19781)
    at android.view.ViewGroup.layout(ViewGroup.java:6144)
    at android.widget.ListView.setupChild(ListView.java:2206)
    at android.widget.ListView.makeAndAddView(ListView.java:2090)
    at android.widget.ListView.fillSpecific(ListView.java:1494)
    at android.widget.ListView.layoutChildren(ListView.java:1857)
    at android.widget.AbsListView.onLayout(AbsListView.java:2226)
    at android.view.View.layout(View.java:19781)
    at android.view.ViewGroup.layout(ViewGroup.java:6144)
wenchaosong commented 5 years ago

@ZTFtrue 你是用我的 demo 测试的 还是自己的项目

wenchaosong commented 5 years ago

你先用我的 demo 测试一下吧,就首页,下拉更新的时候,传个没有数据的 list ,因为这个 IllegalStateException 跟代码逻辑也有一定的关系

ZTFtrue commented 5 years ago

是自己的项目。 先给的listsize 不为0,并且让他自动播放,然后在更新为0. 我先拿demo试试

ZTFtrue commented 5 years ago
 } catch (Exception e) {

        }
// line  170

提个建议 Exception 应该打出来

ZTFtrue commented 5 years ago
     new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                App.images.clear();
                banner.update(App.images);
            }
        }, 20000); 

用手触摸

java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 5000, found: 0 Pager id: com.test:id/bannerViewPager Pager class: class com.ms.banner.view.BannerViewPager Problematic adapter: class com.ms.banner.Banner$BannerPagerAdapter
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1167)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
        at android.support.v4.view.ViewPager$3.run(ViewPager.java:273)
        at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:2025)
        at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:2155)
wenchaosong commented 5 years ago

@ZTFtrue 你的意思是在刷新的时候用手触摸吗

ZTFtrue commented 5 years ago

直接用手触摸,不需要刷新

package com.test.demo;

import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import com.ms.banner.Banner;
import com.ms.banner.Transformer;
import com.ms.banner.holder.BannerViewHolder;
import com.ms.banner.holder.HolderCreator;
import com.test.App;
import com.test.R;
import com.test.SampleAdapter;
import com.test.ui.CustomViewHolder;

import java.util.ArrayList;
import java.util.List;

public class BannerAnimationActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

    Banner banner;
    List<Class<? extends ViewPager.PageTransformer>> transformers = new ArrayList<>();

    public void initData() {
        transformers.add(Transformer.Default);
        transformers.add(Transformer.Accordion);
        transformers.add(Transformer.BackgroundToForeground);
        transformers.add(Transformer.ForegroundToBackground);
        transformers.add(Transformer.CubeIn);//兼容问题,慎用
        transformers.add(Transformer.CubeOut);
        transformers.add(Transformer.DepthPage);
        transformers.add(Transformer.FlipHorizontal);
        transformers.add(Transformer.FlipVertical);
        transformers.add(Transformer.RotateDown);
        transformers.add(Transformer.RotateUp);
        transformers.add(Transformer.ScaleInOut);
        transformers.add(Transformer.Scale);
        transformers.add(Transformer.ScaleRight);
        transformers.add(Transformer.Stack);
        transformers.add(Transformer.Tablet);
        transformers.add(Transformer.ZoomIn);
        transformers.add(Transformer.ZoomOut);
        transformers.add(Transformer.ZoomOutSlide);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_banner_animation);
        initData();
        banner = (Banner) findViewById(R.id.banner);
        ListView listView = (ListView) findViewById(R.id.list);
        String[] data = getResources().getStringArray(R.array.anim);
        listView.setAdapter(new SampleAdapter(this, data));
        listView.setOnItemClickListener(this);

        //简单使用
        banner.setAutoPlay(true)
                .setPages(App.images, new HolderCreator<BannerViewHolder>() {
                    @Override
                    public BannerViewHolder createViewHolder() {
                        return new CustomViewHolder();
                    }
                })
                .setDelayTime(3000)
                .start();
       // 触摸
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                App.images.clear();
                banner.update(App.images);
            }
        }, 20000);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        banner.setBannerAnimation(transformers.get(position));
    }
}
ZTFtrue commented 5 years ago
 private void setData() {
        if (isLoop) {
            //currentItem = 1;
            currentItem = NUM / 2 - ((NUM / 2) % count) + 1;
            lastPosition = 1;
        } else {
            currentItem = 0;
            lastPosition = 0;
        }
        if (adapter == null) {
            adapter = new BannerPagerAdapter();
            viewPager.addOnPageChangeListener(this);
        }
        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(currentItem);
        viewPager.setOffscreenPageLimit(count);
        if (isScroll && count > 1) {
            viewPager.setScrollable(true);
        } else {
            viewPager.setScrollable(false);
        }
        startAutoPlay();
    }
ZTFtrue commented 5 years ago
  currentItem = NUM / 2 - ((NUM / 2) % count) + 1;
   lastPosition = 1;
  @Override
        public int getCount() {
            if (mDatas.size() == 1) {
                return mDatas.size();
            } else if (mDatas.size() < 1) {
                return 0;
            } else {
                if (isLoop)
                    //return mDatas.size() + 2;
                    return NUM;
                else
                    return mDatas.size();
            }
        }

我没有细看代码,我感觉是这两个地方出错了

wenchaosong commented 5 years ago

@ZTFtrue 其实这个问题就多加个判断就行了,我等下就更新一下版本,待会用最新版本就行了

wenchaosong commented 5 years ago

@ZTFtrue 你试试 2.3.0

ZTFtrue commented 5 years ago

  if (imageUrls.size() == 0) {
            bannerDefaultImage.setVisibility(VISIBLE);
        } else {
            this.mDatas.clear();
            this.indicatorImages.clear();
            this.mDatas.addAll(imageUrls);
            this.count = this.mDatas.size();
            start();
        }

这么做原来的内容是不是还在运行?

wenchaosong commented 5 years ago

@ZTFtrue 你说的是对的,我优化了一下逻辑

ZTFtrue commented 5 years ago
   public void update(List<?> imageUrls, List<String> titles) {
        this.titles.clear();
        this.titles.addAll(titles);
        update(imageUrls);
    }

    public void update(List<?> imageUrls) {
        if (imageUrls == null) {
            imageUrls = new ArrayList<>();
        }
        if (imageUrls.size() == 0) {
            bannerDefaultImage.setVisibility(VISIBLE);
            this.mDatas.clear();
            this.indicatorImages.clear();
            adapter.notifyDataSetChanged();
        } else {
            this.mDatas.clear();
            this.indicatorImages.clear();
            this.mDatas.addAll(imageUrls);
            this.count = this.mDatas.size();
            start();
        }
    }