0

I am dynamically implementing the Intro screen for the first time app launch. I am getting the images from the server through the api call, I am getting 5 images from the server and loading in the viewpager. While sliding to the fifth image the app crashes with the below error Here is my code,

public class IntroScreenActivity extends AppCompatActivity {

    @BindView(R.id.view_pager)
    ViewPager mviewPager;
    @BindView(R.id.layoutDots)
    LinearLayout mLayoutDots;
    @BindView(R.id.skip)
    TextView mSkip;
    @BindView(R.id.next)
    TextView mNext;
    @BindView(R.id.progressBar)
    ProgressBar mProgressBar;

    private TextView[] dots;
    private SliderSharedPreferences sliderSharedPreferences;
    private ArrayList<String> introImageSlidersList;
    private int currentItem;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_introscreen);
        ButterKnife.bind(this);
        introImageSlidersList = new ArrayList<>();

         getIntroScreenImages();

        // Checking for first time launch - before calling setContentView()
        sliderSharedPreferences = new SliderSharedPreferences(this);
        if (!sliderSharedPreferences.isFirstTimeLaunch()) {
            launchHomeScreen();
            finish();
        }
        init();

        // adding bottom dots
        addBottomDots(0);

        mSkip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                launchHomeScreen();
            }
        });

        mNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // checking for last page
                // if last page home screen will be launched
                if (currentItem < introImageSlidersList.size() - 1) {
                    ++currentItem; // increase the value by 1
                    mviewPager.setCurrentItem(currentItem); // set the layout at next position
                } else {
                    launchHomeScreen();
                }
            }
        });
    }


    private void init() {
        for (int i = 0; i < introImageSlidersList.size(); i++)
            mviewPager.setAdapter(new SlidingImage_Adapter(this, introImageSlidersList));

        // Pager listener over indicator
        mviewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                currentItem = position; // currentItem used to get current position and then increase position on click on next button

                addBottomDots(position);

                if (position == introImageSlidersList.size() - 1) {
                    // last page. make button text to GOT IT
                    mSkip.setVisibility(View.GONE);
                } else {

                }
            }

            @Override
            public void onPageScrolled(int pos, float arg1, int arg2) {

            }

            @Override
            public void onPageScrollStateChanged(int pos) {

            }
        });

    }

    private int getItem(int i) {
        return mviewPager.getCurrentItem() + i;
    }

    public class SlidingImage_Adapter extends PagerAdapter {

        private ArrayList<String> imageList;
        private LayoutInflater inflater;
        private Context context;

        public SlidingImage_Adapter(Context context, ArrayList<String> imageList) {
            this.context = context;
            this.imageList = imageList;
            inflater = LayoutInflater.from(context);
        }

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

        @Override
        public int getCount() {
            return imageList.size();
        }

        @Override
        public Object instantiateItem(ViewGroup view, int position) {
            View imageLayout = inflater.inflate(R.layout.intro_slides, view, false);

            assert imageLayout != null;
            final ImageView imageView = (ImageView) imageLayout
                    .findViewById(R.id.image);
            Picasso.with(context).load(PawParentConstants.BASE_URL + introImageSlidersList.get(position)).fit().centerCrop().placeholder(R.drawable.pawsanta_logo).into(imageView);

            view.addView(imageLayout, 0);

            return imageLayout;
        }

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

        @Override
        public void restoreState(Parcelable state, ClassLoader loader) {
        }

        @Override
        public Parcelable saveState() {
            return null;
        }


    }


    private void addBottomDots(int currentPage) {
        dots = new TextView[introImageSlidersList.size()];

        int[] colorsActive = getResources().getIntArray(R.array.array_dot_active);
        int[] colorsInactive = getResources().getIntArray(R.array.array_dot_inactive);
        Log.e("dots", String.valueOf(dots.length));
        Log.e("introImageSlidersList", String.valueOf(introImageSlidersList.size()));
        mLayoutDots.removeAllViews();
        for (int i = 0; i < dots.length; i++) {
            dots[i] = new TextView(this);
            dots[i].setText(Html.fromHtml("&#8226;"));
            dots[i].setTextSize(35);
            Log.e("currentPage", String.valueOf(currentPage));
            dots[i].setTextColor(colorsInactive[currentPage]);
            mLayoutDots.addView(dots[i]);
        }

        if (dots.length > 0)
            dots[currentPage].setTextColor(colorsActive[currentPage]);
    }

    private void launchHomeScreen() {
       Toast.makeText(getActivity(), "Launch home screen, Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onBackPressed() {
        finish();
        finishAffinity();
    }

    private void getIntroScreenImages() {

        if (NetworkConnectionMonitor.getInstance().isNetworkConnected()) {
            Call<JsonObject> call = PawParentConnect.getInstance(IntroScreenActivity.this).getApi().getIntroScreenSlider();

            call.enqueue(new Callback<JsonObject>() {
                @Override
                public void onResponse(@NonNull Call<JsonObject> call, @NonNull Response<JsonObject> response) {
                    if (response.isSuccessful() && response.body() != null) {
                        try {
                            JsonObject jsonObject = response.body().getAsJsonObject();
                            String status = jsonObject.get("status").getAsString();
                            switch (status) {
                                case "Success":
                                    JsonArray dataArray = jsonObject.getAsJsonArray("data");
                                    if (dataArray != null && dataArray.size() > 0) {
                                        Type listType = new TypeToken<List<JsonObject>>() {
                                        }.getType();
                                        final List<JsonObject> imageObjects = new Gson().fromJson(dataArray, listType);

                                        for (int i = 0; i < dataArray.size(); i++) {
                                            introImageSlidersList.add(imageObjects.get(i).get("path").getAsString());
                                        }
                                        init();
                                        addBottomDots(0);
                                    } else {

                                    }
                                    break;
                                case "Failure":
                                    Toast.makeText(IntroScreenActivity.this, R.string.try_again, Toast.LENGTH_SHORT).show();
                                    break;
                                default:
                                    Toast.makeText(IntroScreenActivity.this, R.string.try_again, Toast.LENGTH_SHORT).show();
                                    break;
                            }
                        } catch (Exception e) {
                            //Toast.makeText(getActivity(), R.string.try_again, Toast.LENGTH_SHORT).show();
                        }
                    }
                }

                @Override
                public void onFailure(@NonNull Call<JsonObject> call, @NonNull Throwable t) {
                    Toast.makeText(IntroScreenActivity.this, R.string.try_again, Toast.LENGTH_SHORT).show();
                }
            });
        } else {
            Toast.makeText(IntroScreenActivity.this, R.string.check_internet, Toast.LENGTH_SHORT).show();
        }
    }
}

java.lang.ArrayIndexOutOfBoundsException: length=4; index=4 at com.slider.view.splash.IntroScreenActivity.addBottomDots(IntroScreenActivity.java:222) at com.slider.view.splash.IntroScreenActivity.access$300(IntroScreenActivity.java:46) at com.slider.view.splash.IntroScreenActivity$3.onPageSelected(IntroScreenActivity.java:128)

Claudio
  • 10,614
  • 4
  • 31
  • 71
Meena Dev
  • 82
  • 1
  • 9

0 Answers0