Skip to content

Stack Overflow when setting data #24

Description

@danielevitali

I am getting this exception

java.lang.StackOverflowError
            at com.lykehq.ui.home.teasers.BannersAdapter.getCount(BannersAdapter.java:69)
            at com.lykehq.views.loopviewpager.LoopPagerAdapterWrapper.getRealCount(LoopPagerAdapterWrapper.java:102)
            at com.lykehq.views.loopviewpager.LoopPagerAdapterWrapper.toRealPosition(LoopPagerAdapterWrapper.java:69)
            at com.lykehq.views.loopviewpager.LoopViewPager$1.onPageScrolled(LoopViewPager.java:151)
            at android.support.v4.view.ViewPager.dispatchOnPageScrolled(ViewPager.java:1769)
            at android.support.v4.view.ViewPager.onPageScrolled(ViewPager.java:1748)
            at android.support.v4.view.ViewPager.pageScrolled(ViewPager.java:1670)
            at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:576)
            at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:552)
            at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:513)
            at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:505)
            at com.lykehq.views.loopviewpager.LoopViewPager.setCurrentItem(LoopViewPager.java:101)
            at com.lykehq.views.loopviewpager.LoopViewPager$1.onPageScrolled(LoopViewPager.java:156)
            at android.support.v4.view.ViewPager.dispatchOnPageScrolled(ViewPager.java:1769)
            at android.support.v4.view.ViewPager.onPageScrolled(ViewPager.java:1748)
            at android.support.v4.view.ViewPager.pageScrolled(ViewPager.java:1670)
            at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:576)
            at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:552)
            at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:513)
            at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:505)
            at com.lykehq.views.loopviewpager.LoopViewPager.setCurrentItem(LoopViewPager.java:101)
            at com.lykehq.views.loopviewpager.LoopViewPager$1.onPageScrolled(LoopViewPager.java:156)
            at android.support.v4.view.ViewPager.dispatchOnPageScrolled(ViewPager.java:1769)
            at android.support.v4.view.ViewPager.onPageScrolled(ViewPager.java:1748)
            at android.support.v4.view.ViewPager.pageScrolled(ViewPager.java:1670)
            at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:576)
            at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:552)
            at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:513)
            at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:505)
            at com.lykehq.views.loopviewpager.LoopViewPager.setCurrentItem(LoopViewPager.java:101)
            at com.lykehq.views.loopviewpager.LoopViewPager$1.onPageScrolled(LoopViewPager.java:156)
            at android.support.v4.view.ViewPager.dispatchOnPageScrolled(ViewPager.java:1769)
            at android.support.v4.view.ViewPager.onPageScrolled(ViewPager.java:1748)
            at android.support.v4.view.ViewPager.pageScrolled(ViewPager.java:1670)
            at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:576)
            at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:552)
            at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:513)
            at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:505)
            at com.lykehq.views.loopviewpager.LoopViewPager.setCurrentItem(LoopViewPager.java:101)
            at com.lykehq.views.loopviewpager.LoopViewPager$1.onPageScrolled(LoopViewPager.java:156)
            at android.support.v4.view.ViewPager.dispatchOnPageScrolled(ViewPager.java:1769)
            at android.support.v4.view.ViewPager.onPageScrolled(ViewPager.java:1748)
            at android.support.v4.view.ViewPager.pageScrolled(ViewPager.java:1670)
            at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:576)
            at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:552)
            at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:513)
            at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:505)
            at com.lykehq.views.loopviewpager.LoopViewPager.setCurrentItem(LoopViewPager.java:101)
            at com.lykehq.views.loopviewpager.LoopViewPager$1.onPageScrolled(LoopViewPager.java:156)

The LoopViewPager is the first element inside a RecyclerView which is inside a Fragment which is inside a ViewPager along with other 3 Fragment.

So when my Activity starts, I make a request to my backend, while I am waiting I swipe around the 4 fragments and then suddenly the app crashes. This doesn't happen always unfortunately.

If I use a normal ViewPager everything looks fine.

Here is my adapter

public class BannersAdapter extends PagerAdapter {

    private Context context;
    private List<Teaser> teasers;
    private AdapterListener listener;

    public BannersAdapter(@NonNull Context context, @NonNull AdapterListener listener) {
        this.context = context;
        this.listener = listener;
    }

    public void setTeasers(@NonNull List<Teaser> teasers) {
        this.teasers = teasers;
        notifyDataSetChanged();
    }

    @Override
    public Object instantiateItem(ViewGroup collection, final int position) {
        ImageView imageView = new ImageView(context);
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Teaser teaser = (Teaser) view.getTag(R.id.view_holder_tag);
                listener.onTeaserClick(teaser);
            }
        });
        collection.addView(imageView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

        Teaser teaser = teasers.get(position);
        imageView.setTag(R.id.view_holder_tag, teaser);

        int width = DisplayUtils.getDisplaySize(context)[0];
        String imageUrl = teaser.getImage().getUrl(width);
        Glide.with(context).load(imageUrl).into(imageView);

        return imageView;
    }

    @Override
    public void destroyItem(ViewGroup collection, int position, Object view) {
        collection.removeView((View) view);
    }

    @Override
    public int getCount() {
        if (teasers == null) {
            return 0;
        }
        LogUtils.d("TEST", String.valueOf(teasers.size()));
        return teasers.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    public interface AdapterListener {

        void onTeaserClick(@NonNull Teaser teaser);

    }

I am also using the page indicator from Jake Wharton:

bannersAdapter = new BannersAdapter(context, this);
        bannersViewPager.setAdapter(bannersAdapter);
        pageIndicator.setViewPager(bannersViewPager);

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions