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("•"));
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)