【问题标题】:RecyclerView - java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0RecyclerView - java.lang.IndexOutOfBoundsException:索引 1 无效,大小为 0
【发布时间】:2019-01-01 14:13:12
【问题描述】:

在我的应用程序中,我想在适配器中显示 2 个具有 2 个数组列表数据的不同视图。但是运行时,我收到此错误。

java.lang.IndexOutOfBoundsException:索引:1,大小:0 在 java.util.ArrayList.get(ArrayList.java:411) 在 gjteamcom.doubleteam.CariAdapter.onBindViewHolder(CariAdapter.java:58) 在 android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781) 在 android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823) 在 android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752) 在 android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019) 在 android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858) 在 android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854) 在 android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230) 在 android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557) 在 android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517) 在 android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612) 在 android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924) 在 android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641) 在 android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4194) 在 android.view.View.layout(View.java:17838) 在 android.view.ViewGroup.layout(ViewGroup.java:5754) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1982) 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1826) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1735) 在 android.view.View.layout(View.java:17838) 在 android.view.ViewGroup.layout(ViewGroup.java:5754) 在 android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1915) 在 android.view.View.layout(View.java:17838) 在 android.view.ViewGroup.layout(ViewGroup.java:5754) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:383) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:321) 在 android.view.View.layout(View.java:17838) 在 android.view.ViewGroup.layout(ViewGroup.java:5754) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1982) 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1826) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1735) 在 android.view.View.layout(View.java:17838)

这是我的适配器:

public class CariAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

Context context;
ArrayList<Cari> cari;
ArrayList<CariP> carip;
public CariAdapter(Context c, ArrayList<Cari> p, ArrayList<CariP> pp)
{
    context = c;
    cari = p ;
    carip = pp;

}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    switch (i) {
        case 0:
            return new CariViewHolder(LayoutInflater.from(context).inflate(R.layout.cv_cari,viewGroup,false));
        case 2:
            return new CariPViewHolder(LayoutInflater.from(context).inflate(R.layout.cv_carip,viewGroup,false));

            default:
                return null;
    }

}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
    switch (viewHolder.getItemViewType()) {
        case 0:
            CariViewHolder cariViewHolder = (CariViewHolder) viewHolder;
            cariViewHolder.timnama.setText(cari.get(i).getTim_nama());
            cariViewHolder.timkat.setText(cari.get(i).getTim_kategori());
            Picasso.get().load(cari.get(i).getTim_image()).resize(200,200).into(cariViewHolder.timimg);
            break;

        case 2:
            CariPViewHolder cariPViewHolder = (CariPViewHolder) viewHolder;
            cariPViewHolder.akunanama.setText(carip.get(i).getAkun_nickname());
            cariPViewHolder.akuninterest.setText(carip.get(i).getAkun_interest());
            Picasso.get().load(carip.get(i).getAkun_profilimage()).resize(200,200).into(cariPViewHolder.akunimg);
            break;

            default:

    }
}

@Override
public int getItemViewType(int position) {
    return position % 2 * 2;
}

@Override
public int getItemCount() {
    return cari.size()+carip.size();

}

class CariViewHolder extends RecyclerView.ViewHolder
{
    TextView timnama,timkat;
    ImageView timimg;
    public CariViewHolder(@NonNull View itemView) {
        super(itemView);
        timnama = itemView.findViewById(R.id.txt_cvnamacari);
        timkat = itemView.findViewById(R.id.txt_cvkategori);
        timimg = itemView.findViewById(R.id.img_cvcari);
    }
}

class CariPViewHolder extends RecyclerView.ViewHolder
{
    TextView akunanama,akuninterest;
    ImageView akunimg;
    public CariPViewHolder(@NonNull View itemView) {
        super(itemView);
        akunanama = itemView.findViewById(R.id.txt_cvpnamacari);
        akuninterest = itemView.findViewById(R.id.txt_cvpinterest);
        akunimg = itemView.findViewById(R.id.img_cvpcari);

    }
}}

我仍然不明白 getItemCount()getItemViewType() 将如何在 BindViewHolder 上工作 我该如何解决这个错误?

【问题讨论】:

  • 你的 cari 和 cariP 列表的大小总是一样吗?
  • 不,我认为它们的大小不同,因为它们是我的数据库(firebase)中的孩子,我想用 recyclerview 将其显示到我的应用程序
  • 你需要正确索引你的列表

标签: java android indexoutofboundsexception android-recyclerview


【解决方案1】:

假设两个数组的大小相同。那么你需要得到正确的位置来从你的数组中获取数据。 i 这里代表你的回收站视图项目的位置,而不是你的数组项目的位置 这里是 onBindView 函数

@Override
public void onBindViewHolder(@NonNull 
RecyclerView.ViewHolder viewHolder, int i) {
switch (viewHolder.getItemViewType()) {
        case 0:
            CariViewHolder cariViewHolder = (CariViewHolder) viewHolder;
            cariViewHolder.timnama.setText(cari.get(i/2).getTim_nama());
            cariViewHolder.timkat.setText(cari.get(i/2).getTim_kategori());
            Picasso.get().load(cari.get(i/2).getTim_image()).resize(200,200).into(cariViewHolder.timimg);
            break;

        case 2:
            CariPViewHolder cariPViewHolder = (CariPViewHolder) viewHolder;
            cariPViewHolder.akunanama.setText(carip.get(i/2).getAkun_nickname());
            cariPViewHolder.akuninterest.setText(carip.get(i/2).getAkun_interest());
            Picasso.get().load(carip.get(i/2).getAkun_profilimage()).resize(200,200).into(cariPViewHolder.akunimg);
            break;

            default:

    }
}

【讨论】:

  • 嘿,我尝试像你说的那样在 onBindView 的 .get(i) 处进行修复。但我仍然有一个错误。 java.lang.IndexOutOfBoundsException:索引:3,大小:3
【解决方案2】:

您的代码在两个地方引起了问题。

  1. 有一个隐含的假设是cari.size() == carip.size()cari.size() = carip.size() + 1。您可能已经知道这一点。刚刚添加此内容以确保您了解它。

  2. onBindViewHolder,你不能直接使用i(位置)。考虑cari 的内容为 C0、C1carip 的内容为 P0 的情况。

    李>

与每个项目关联的位置(is)将是:C0:0、P0:1 和 C1:2.

您现在可以看到问题所在。这里,carip.size() == 1 表示它的最大索引将为 0。但在 onBindViewHolder 中使用的位置(i)将为 1。这是超出范围的。

您需要在onBindViewHolder 中将i 的用法替换为i/2

这将导致新的关联:C0:0, P0:0 和 C1:1 这正是你想要的

【讨论】:

  • 我仍然收到错误 IndexOutofBound 异常。我很欣赏你的回答,但我仍然无法理解这个 getitemcount() 方法如何在 2 个数组列表大小中工作。
【解决方案3】:

您对使用不同的视图类型有一些误解。你的问题是这个功能

@Override
public int getItemCount() {
    return cari.size()+carip.size();
}

您必须拥有包含 viewType 和 Model 的单个列表项。建议您阅读此article 并了解如何创建 itemModel

这很难解释你的代码,但不要害羞提出问题,我会回答并帮助你

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多