【问题标题】:IndexOutOfBoundsException: Invalid index 0, size is 0. how i can solver this problemIndexOutOfBoundsException: Invalid index 0, size is 0. 我该如何解决这个问题
【发布时间】:2019-07-22 14:12:23
【问题描述】:

我正在为 RecyclerView 中的 OnClickListener 编写代码,我想从 json 中放入数据。来自 json 的数据它的工作,但我不能将数据带到其他活动。

这是一个新的android studio版本是3.4.1。

此代码在 caritenda 中。

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)

【问题讨论】:

  • 它说tendaList是空的
  • 你得到这个是因为你的列表是空的……至少tendaList是空的。你不能在一个空列表的位置得到东西......你会得到一个例外。

标签: android android-json


【解决方案1】:
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);
    }
}

【讨论】:

  • 避免嵌套!对于简单的功能,这是不好的做法。相反,使用if (tendaList.isEmpty()) { return; } // 函数的其余部分`
【解决方案2】:

方法getAdapterPosition 不能这样工作。见:getAdapterPosition() not returning position of item in 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);
    }
}

【讨论】:

    猜你喜欢
    • 2016-03-30
    • 2018-08-01
    • 2020-02-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多