1

The issue is caused by:

java.lang.ArrayIndexOutOfBoundsException: length=0; index=0

at com.example.proje.DetayActivity.onCreate(DetayActivity.java:78)

This page is where i add Viewpager to be shown on the activity. I think there is problem with the arraylist but it looks normal as i couldn't find any problem. Thank you for the help.


package com.example.proje;
 imports..

public class DetayActivity extends AppCompatActivity {

    ViewPager viewPager;
    LinearLayout sliderDotspanel;
    private int dotscount;
    private ImageView[] dots;
    private ArrayList<String> urls;
    String key;
    TextView txt1;
    TextView txt2;
    TextView txt3;
    TextView txt4;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detay);
        setTitle("Detaylar");

        txt1 = findViewById(R.id.txttarih);
        txt2 = findViewById(R.id.txturunadi);
        txt3 = findViewById(R.id.txtfiyati);
        txt4 = findViewById(R.id.txtaciklama);

        Intent intent = getIntent();
        key = intent.getStringExtra("key");
        urls = new ArrayList<>();

        getdata();


        viewPager = findViewById(R.id.viewPager);

        sliderDotspanel = findViewById(R.id.SliderDots);


        ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(this , urls);

        viewPager.setAdapter(viewPagerAdapter);

        dotscount = viewPagerAdapter.getCount();
        dots = new ImageView[dotscount];

        for (int i = 0; i < dotscount; i++) {

            dots[i] = new ImageView(this);
            dots[i].setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.non_active_dot));

            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);

            params.setMargins(8, 0, 8, 0);

            sliderDotspanel.addView(dots[i], params);
        }

        dots[0].setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.active_dot));

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
                for (int i = 0; i < dotscount; i++) {
                    dots[i].setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.non_active_dot));
                }
                dots[position].setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.active_dot));
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });

    }

    private void getdata() {

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("urunler").child(key);

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                Urun urun = dataSnapshot.getValue(Urun.class);
                txt1.setText(urun.getTarih());
                txt2.setText(urun.getUrunAdi());
                txt3.setText(Double.toString(urun.getFiyat()));
                txt4.setText(urun.getAciklama());
                urls.add(urun.getResim1());
                urls.add(urun.getResim2());
                urls.add(urun.getResim3());

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
}
}

this page is the viewpager adapter

package com.example.proje;
imports..

public class ViewPagerAdapter extends PagerAdapter {

    private Context context;
    private LayoutInflater layoutInflater;
    private Integer [] images = {R.drawable.logo,R.drawable.doluredkalp,R.drawable.redheart};
    private ArrayList<String> urls = new ArrayList<>();



    public ViewPagerAdapter(Context context , ArrayList<String> urls) {
        this.context = context;
        this.urls = urls;

    }

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

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

    @Override
    public Object instantiateItem(ViewGroup container, final int position) {

        final String url = urls.get(position);

        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = layoutInflater.inflate(R.layout.layoutpager, null);
        ImageView imageView = view.findViewById(R.id.imageView);    
        Picasso.get().load(url).placeholder(R.drawable.logo).into(imageView);

        ViewPager vp = (ViewPager) container;
        vp.addView(view, 0);
        return view;
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {

        ViewPager vp = (ViewPager) container;
        View view = (View) object;
        vp.removeView(view);

    }
}
denvercoder9
  • 2,979
  • 3
  • 28
  • 41
zeynep
  • 11
  • 4
  • Use a debugger and go line-by-line to figure out what went wrong. – denvercoder9 May 29 '20 at 18:08
  • 1
    Does this answer your question? [What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it?](https://stackoverflow.com/questions/5554734/what-causes-a-java-lang-arrayindexoutofboundsexception-and-how-do-i-prevent-it) – denvercoder9 May 29 '20 at 18:10

1 Answers1

1

Your problem is in line

dots[0].setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.active_dot));

dots array is empty and when you trying to get element at index 0 you get this error because there is no element at index 0.

Updated:

You can see that dots is an array with count equals dotscount.

dotscount variable is count of viewPagerAdapter items

You pass to viewPagerAdapter urls array which is empty.

That is the reason why you getting error ArrayIndexOutOfBoundsException

I think you should create dots array in onDataChange method after you populate urls array, this will fix this error

Rasul
  • 727
  • 7
  • 20
  • I was gonna write a detailed answer but since you posted first, I'm gonna pass. Please add an explanation, if possible, why `dots` array is empty and why `dotscount` is 0. – denvercoder9 May 29 '20 at 18:13
  • In your code, `getdata()` is async call and you are setting you adapter before it. So they need to be aligned with each other, you need to set your adapter in `onDataChange` or notifyDataSet change every time its updated. Due to this issue `dotscount = viewPagerAdapter.getCount();` will be 0 always. At the time you are setting it adapter size was always 0. – Anuj Sharma May 29 '20 at 18:17