【问题标题】:RecyclerView Nesting java.lang.IndexOutOfBoundsException: Invalid index 5, size is 5 [duplicate]RecyclerView嵌套java.lang.IndexOutOfBoundsException:索引5无效,大小为5 [重复]
【发布时间】:2019-02-27 05:51:34
【问题描述】:

场景:我在 recyclerview 中有 5 个数据,并尝试添加 addOnItemTouchListener。首先在 1 到 3 RecyclerView Row 中运行良好。但如果我点击 4 和 5 行,就会出现异常。

代码:

 mRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), mRecyclerView, new RecyclerTouchListener.ClickListener() {
            @Override
            public void onClick(View view, int position) {

                DaftarPengumuman pengumuman = listPengumuman.get(position-1);

                Intent intent = new Intent(getActivity(), DetailPengumuman.class);
//                intent.putExtra("keys", keys.get(position));
                intent.putExtra("namamatkul", namaMatkulPut.get(position-1));
                intent.putExtra("namapengumuman", namaPengumumanPut.get(position-1));
                intent.putExtra("tanggalpengumuman", tanggalPengumumanPut.get(position-1));
                intent.putExtra("judulpengumuman", judulPengumumanPut.get(position-1));
                intent.putExtra("deskripsipengumuman", deskripsiPengumumanPut.get(position-1));
                startActivity(intent);

            }

            @Override
            public void onLongClick(View view, int position) {

            }
    }));

在我在位置上做-1之前,异常说:

java.lang.IndexOutOfBoundsException: Invalid index 6, size is 5

这是我的适配器

public class PengumumanAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context mContext;
    List<ListItem> consolidatedList = new ArrayList<>();

    public PengumumanAdapter(Context context, List<ListItem> consolidatedList) {
        this.consolidatedList = consolidatedList;
        this.mContext = context;

    }


    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        RecyclerView.ViewHolder viewHolder = null;
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());

        switch (viewType) {

            case ListItem.TYPE_TASK:
                View v1 = inflater.inflate(R.layout.costume_row_pengumuman, parent,
                        false);
                viewHolder = new GeneralViewHolder(v1);
                break;

            case ListItem.TYPE_NAME:
                View v2 = inflater.inflate(R.layout.costum_row_pengumuman_name, parent, false);
                viewHolder = new DateViewHolder(v2);
                break;
        }

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {

        switch (viewHolder.getItemViewType()) {

            case ListItem.TYPE_TASK:

                GeneralItem generalItem   = (GeneralItem) consolidatedList.get(position);
                GeneralViewHolder generalViewHolder= (GeneralViewHolder) viewHolder;
                generalViewHolder.txtJudul.setText(generalItem.getDaftarPengumuman().getJudul());
                generalViewHolder.txtDeskripsi.setText(generalItem.getDaftarPengumuman().getDeskripsi());
                generalViewHolder.txtTanggal.setText(generalItem.getDaftarPengumuman().getTanggal_peng());


                break;

            case ListItem.TYPE_NAME:
                PengumumanItem dateItem = (PengumumanItem) consolidatedList.get(position);
                DateViewHolder dateViewHolder = (DateViewHolder) viewHolder;

                dateViewHolder.txtName.setText(dateItem.getNama_matkul());
                // Populate date item data here

                break;
        }
    }

    // ViewHolder for date row item
    class DateViewHolder extends RecyclerView.ViewHolder {
        protected TextView txtName;

        public DateViewHolder(View v) {
            super(v);
            this.txtName = (TextView) v.findViewById(R.id.name_p);

        }
    }

    // View holder for general row item
    class GeneralViewHolder extends RecyclerView.ViewHolder {
        protected TextView txtJudul,txtDeskripsi,txtTanggal;

        public GeneralViewHolder(View v) {
            super(v);
            this.txtJudul = (TextView) v.findViewById(R.id.judul_p);
            this.txtDeskripsi = (TextView) v.findViewById(R.id.deskripsi_p);
            this.txtTanggal = (TextView) v.findViewById(R.id.tanggal_p);
        }
    }

    @Override
    public int getItemViewType(int position) {
        return consolidatedList.get(position).getType();
    }

    @Override
    public int getItemCount() {
        return consolidatedList != null ? consolidatedList.size() : 0;
    }
}

解决方案

在解决之前,这个崩溃的问题是hashmap列表和recyclerview的列表类临时大小不同。我使用嵌套数组列表 here.

我从@Suraj Vaishnav 找到了这个解决方案。 1.从solidifiedList获取数据,因为这个数组是传给adapter的。 2. 为 consolidatelist >= position 设置条件 3. 放入Extra并制作GeneralItem对象,并从中获取数据。

    mRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(getContext(), mRecyclerView, new RecyclerTouchListener.ClickListener() {
        @Override
        public void onClick(View view, int position) {

            if(consolidatedList.size()-1 >= position)
            {
                GeneralItem generalItem   = (GeneralItem) consolidatedList.get(position);
                Intent intent = new Intent(getActivity(), DetailPengumuman.class);
                intent.putExtra("namamatkul", generalItem.getDaftarPengumuman().getNama_p());
                intent.putExtra("tanggalpengumuman", generalItem.getDaftarPengumuman().getTanggal_peng());
                intent.putExtra("judulpengumuman", generalItem.getDaftarPengumuman().getJudul());
                intent.putExtra("deskripsipengumuman", generalItem.getDaftarPengumuman().getDeskripsi());
                startActivity(intent);






            }



        }

        @Override
        public void onLongClick(View view, int position) {

        }
    }));

【问题讨论】:

  • listPengumuman 列表似乎有问题。请检查该列表的数据和计数。
  • 数据正确,显示5条数据
  • 您的问题在于 DaftarPengumuman pengumuman = listPengumuman.get(position-1) 一些您如何检索无效位置的数据。但正如你所说,你的数据是正确的,然后分享你的设置适配器代码。
  • 这是我的适配器先生@Jay
  • 请检查 hashMap() 方法。您的solidatedList 和listPengumuman 的大小会有所不同。

标签: java android arrays android-recyclerview indexoutofboundsexception


【解决方案1】:

试试这个代码来获取数据。

Object  data = consolidatedList.get(position);
        if (data instanceof  GeneralItem){
            DaftarPengumuman pengumuman = data.getDaftarPengumuman();
        }

【讨论】:

  • 这在逻辑上是相当正确的,但是我第一次看到这段代码。我很困惑。解释:你必须得到solidifiedList 而不是listPengumuman。然后,当您 putExtra 时,您也应该发送统一列表数据。
【解决方案2】:

position参数是recycler视图中点击的item的索引,你不应该在这里使用position-1。只需使用位置。另一件事是DaftarPengumuman pengumuman = listPengumuman.get(position-1); 这可能工作正常。但在这些陈述中:

intent.putExtra("namamatkul", namaMatkulPut.get(position-1));
                intent.putExtra("namapengumuman", namaPengumumanPut.get(position-1));
                intent.putExtra("tanggalpengumuman", tanggalPengumumanPut.get(position-1));
                intent.putExtra("judulpengumuman", judulPengumumanPut.get(position-1));
                intent.putExtra("deskripsipengumuman", deskripsiPengumumanPut.get(position-1));

您对不同的数组使用相同的参数(位置)。确保它们每个都具有相同的大小。

--新的---

问题是consolidatedList size和listPengumuman不一样。

要避免这种崩溃,您可以这样做:

if(listPengumuman.size()-1 >= position)
{
 DaftarPengumuman pengumuman = listPengumuman.get(position);
}

【讨论】:

  • 我已经评论了所有的 intent.putextra 并用DaftarPengumuman pengumuman = listPengumuman.get(position) 更改位置1。但是异常来了 java.lang.IndexOutOfBoundsException: Invalid index 6, size is 5
  • 我的答案已经更新,请查收
  • 我已经把我的代码改成了你的,但是还是有异常 java.lang.IndexOutOfBoundsException: Invalid index 5, size is 5
  • 抱歉打错了,我已经改变了我的条件和里面if blick的声明,请检查
  • 这是可行的,但是第 4 行和第 5 行没有显示异常,但是如果我点击它,它什么也不做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多