IndexOutOfBoundsException: недопустимый индекс 0, размер равен 0. как я могу решить эту проблему

Я пишу код для OnClickListener в RecyclerView и хочу поместить данные из json. данные из json работают, но я не могу перенести данные в другую деятельность.

это новая версия студии Android 3.4.1.

этот код в каритенде.

public void onClick(View view, int position) {

        Tenda ambil = tendaList.get(position);
        String alamat = ambil.getAlamat();
        String telepon = ambil.getPhone();
        String img = ambil.getImageUrl();
        String lokasi = ambil.getLokasi();
        Intent i = new Intent(this, PilihTenda.class);
        i.putExtra(Key_RegisterActivity,new String[]{alamat,telepon, img, lokasi});
        startActivity(i);
    }

это мой адаптер

    itemView.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View view) {
                   listener.onClick(view, getAdapterPosition());
               }
           });
        }
    }

это ошибка.

    E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.mydome, PID: 8658
    java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
        at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
        at java.util.ArrayList.get(ArrayList.java:308)
        at com.example.mydome.ui.Caritenda.onClick(Caritenda.java:95)
        at com.example.mydome.adapters.TendaAdapter$MyViewHolder$1.onClick(TendaAdapter.java:78)
        at android.view.View.performClick(View.java:5212)
        at android.view.View$PerformClick.run(View.java:21214)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5619)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:853)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:737)

person dikky setiawan    schedule 22.07.2019    source источник
comment
Пишет, что tendaList пуст.   -  person melianor    schedule 22.07.2019
comment
вы получаете это, потому что ваш список пуст... по крайней мере, tendaList пуст. вы не можете получить что-то в позиции пустого списка.... вы получите исключение.   -  person letsCode    schedule 22.07.2019


Ответы (2)


Tenda ambil = tendaList.get(position); 

Здесь вы получаете исключение.

Исправьте свой код, как показано ниже

public void onClick(View view, int position) {

    if(tendaList.size > 0){
       Tenda ambil = tendaList.get(position);
       String alamat = ambil.getAlamat();
       String telepon = ambil.getPhone();
       String img = ambil.getImageUrl();
       String lokasi = ambil.getLokasi();
       Intent i = new Intent(this, PilihTenda.class);
       i.putExtra(Key_RegisterActivity,new String[]{alamat,telepon, img, lokasi});
       startActivity(i);
    }
}
person Hardik Bambhania    schedule 22.07.2019
comment
ИЗБЕГАЙТЕ гнездования! Это плохая практика для простых функций. Вместо этого используйте if (tendaList.isEmpty()) { return; } // остальную часть функции` - person Zun; 23.07.2019

Метод getAdapterPosition так не работает. См.: getAdapterPosition() не возвращает позицию элемента в RecyclerView

Лучшим способом было бы установить прослушиватель кликов на самом просмотрщике, и вы также могли бы передать ссылку на объект из списка, по которому щелкнули.

public final class TendaAdapter extends RecyclerView.Adapter<TendaAdapter.ViewHolder> {

    private final List<Tenda> tendaList;
    private final ClickListener listener;

    public TendaAdapter(List<Tenda> tendaList, ClickListener listener) {
        super();
        this.tendaList = tendaList;
        this.listener = listener;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        final View itemView = // create your itemView here
        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        final Tenda ambil = tendaList.get(position);
        holder.bind(ambil, listener);
    }

    @Override
    public int getItemCount() {
        return tendaList.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
        }

        public void bind(Tenda tenda, ClickListener listener) {
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    listener.onClick(tenda);
                }
            });
        }
    }

    interface ClickListener {
        void onClick(Tenda tenda);
    }
}
person TheKarlo95    schedule 22.07.2019