![](/img/trans.png)
[英]java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1 in Sectioned RecyclerView
[英]RecyclerView - java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
在我的应用程序中,我想在适配器中显示 2 个不同的视图和 2 个数组列表数据。但是在运行时,我收到此错误。
java.lang.IndexOutOfBoundsException: Index: 1, Size: 0 at java.util.ArrayList.get(ArrayList.java:411) at gjteamcom.doubleteam.CariAdapter.onBindViewHolder(CariAdapter.java:58) at android.support.v7。 widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781) at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823) at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadViewHolder RecyclerView.java:5752) 在 android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019) 在 android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(Recycler85View) 在.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854) at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230) at android.support.v7.widget.LinearLayoutManager .layoutChunk(LinearLayoutManager.java:1557) 在 android.support.v7.widget.LinearLayoutManager.fi ll(LinearLayoutManager.java:1517) at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612) at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924) at android.support .v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641) at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4194) at android.view.View.layout(View.java:17838) at android.view.ViewGroup.layout(ViewGroup.java:5754) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1982) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1826) at 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) at android.widget.FrameLayout.onLayout(FrameLayout.java:321) at android.view.View.layout(View.java:17838) at 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
工作我该如何解决这个错误?
假设两个数组的大小相同。 那么您需要获得正确的位置以从您的阵列中获取数据。 我在这里代表您的回收站视图项的位置,但不是您的数组项的位置,这里是 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:
}
}
您的代码有两个地方会导致问题。
有一个隐含的假设cari.size() == carip.size()
或cari.size() = carip.size() + 1
。 您可能已经知道这一点。 刚刚添加了这个以确保你知道它。
在onBindViewHolder
,您不能直接使用i
(位置)。 考虑当cari
具有内容 C 0 、C 1并且carip
具有内容 P 0 的情况。
的位置( i
与每个项目相关联的为s)为:C 0:0,P 0:1和C 1:2。
你现在可以看到问题了。 在这里, carip.size() == 1
这意味着它的最大索引将为 0。但是onBindViewHolder
使用的 position( i
) 将为 1。这是越界的。
您需要在onBindViewHolder
中用i/2
替换i
的用法。
这将导致新的关联:C 0 :0、P 0 :0 和 C 1 :1 这正是您想要的
您对使用不同的视图类型有一些误解。 你的问题是这个功能
@Override
public int getItemCount() {
return cari.size()+carip.size();
}
您必须具有包含 viewType 和 Model 的单个列表项。 建议你阅读这篇文章,看看如何创建 itemModel
这很难解释你的代码,但不要害羞提问,我会回答并帮助你
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.