如何解决如何在适配器recyclerview中使用两个arraylist
我想在同一适配器中使用两个arraylist,但出现错误。它没有设置值,我得到了INDEX OUT BOUND EXPECTION
这是我的适配器代码:
public class packagingProductAdapter extends RecyclerView.Adapter<packagingProductAdapter.ViewHolder> {
private List<packingProductPOJO> list_data;
// private List<packingProductPOJO> testPOJO;
private List<testPOJO> test_POJO;
// private packingProduct context;
private testClass context;
String product_id,category_id,quantity = "0",sizeValue = "0";
private static int _value = 0;
PrefManager prefManager;
ProgressLoader progressLoader;
/*
public packagingProductAdapter(List<packingProductPOJO> list_data,List<testPOJO> testPOJO,packingProduct context) {
this.list_data = list_data;
this.test_POJO = testPOJO;
this.context = context;
prefManager = new PrefManager(context);
progressLoader = new ProgressLoader(context);
} */
public packagingProductAdapter(List<packingProductPOJO> list_data,List<testPOJO> test_POJO,testClass context) {
this.list_data = list_data;
this.test_POJO = test_POJO;
this.context = context;
prefManager = new PrefManager(context);
progressLoader = new ProgressLoader(context);
}
@Override
public packagingProductAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.packing_product_cart_view_row,parent,false);
return new packagingProductAdapter.ViewHolder(view);
}
@Override
public void onBindViewHolder(final packagingProductAdapter.ViewHolder holder,final int position){
final packingProductPOJO listData = list_data.get(position);
final testPOJO test_POJO1 = test_POJO.get(position);
holder.setIsRecyclable(false);
if (test_POJO.equals("null")){
holder.linearLayout.setVisibility(View.GONE);
}else
{
holder.linearLayout.setVisibility(View.VISIBLE);
holder.heading.setText(test_POJO1.getContact_name());
// holder.linearLayout.setBackgroundResource((R.drawable.rectangleborder));
}
holder.produt_quantity.setText("= " +listData.getQuantity() );
if (listData.getProductPdf().equals("null")) {
holder.product_name.setText(listData.getCat_name());
}else {
holder.product_name.setText("DOWNLOAD PDF");
}
// holder.heading.setText(listData.getImage());
product_id = listData.getProductid();
category_id = listData.getImage();
holder.purchaseQty.setText(listData.getUser_quantity());
holder.pro_price.setText("Rs. " +listData.getPrice());
final String finalPro_qty = "0";
final String finalProduct_ID = product_id;
holder.count_up.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String removeProductId = listData.getId();
String removeQuantity = listData.getUser_quantity();
int quantity = 0;
try{
quantity = Integer.parseInt(removeQuantity) + 1;
} catch(NumberFormatException ex){ // handle your exception
ex.printStackTrace();
}
if (quantity > Integer.parseInt(listData.getQuantity())){
Toast.makeText(context,"Insufficent Stock ",Toast.LENGTH_LONG).show();
}else {
// context.add("pk@gmail.com",String.valueOf(quantity),finalProduct_ID,"manual",holder.purchaseQty,position,"0");
}
}
});
holder.count_down.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String removeProductId = listData.getId();
String removeQuantity = listData.getUser_quantity();
final int quantity = Integer.valueOf(removeQuantity) - 1;
// context.add("pk@gmail.com","0");
}
});
holder.purchaseQty.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// get alert_dialog.xml view
LayoutInflater li = LayoutInflater.from(context);
View promptsView = li.inflate(R.layout.alert_dialog,null);
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
context);
// set alert_dialog.xml to alertdialog builder
alertDialogBuilder.setView(promptsView);
final EditText userSize = (EditText) promptsView.findViewById(R.id.etUserInput);
final TextView enterQuantity = promptsView.findViewById(R.id.enterQuantity);
// set dialog message
alertDialogBuilder
.setCancelable(false)
.setPositiveButton("OK",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
// Toast.makeText(context,"Entered: "+userInput.getText().toString(),Toast.LENGTH_LONG).show();
final String quantityValue = (userSize.getText().toString());
if (TextUtils.isEmpty(quantityValue)) {
userSize.setError("Quantity cannot be Empty");
Toast.makeText(context,"Quantity cannot be Empty",Toast.LENGTH_LONG).show();
userSize.requestFocus();
return;
}
final int quantity = Integer.valueOf(quantityValue);
if (quantity > Integer.parseInt(listData.getQuantity())){
Toast.makeText(context,Toast.LENGTH_LONG).show();
}else {
// context.add("pk@gmail.com",sizeValue);
}
}
})
.setNegativeButton("Cancel",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
dialog.cancel();
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show();
}
});
}
@Override
public int getItemCount() {
return list_data.size() + test_POJO.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
private CardView cardView;
private TextView purchaseQty,product_name,produt_quantity,heading,pro_price;
private ImageView count_up,count_down;
private LinearLayout topview,userQuantityLayout;
private LinearLayout linearLayout;
public ViewHolder(View itemView) {
super(itemView);
heading = itemView.findViewById(R.id.heading);
purchaseQty= itemView.findViewById(R.id.txtItemQty);
produt_quantity= itemView.findViewById(R.id.total_qty);
product_name=itemView.findViewById(R.id.pro_name);
purchaseQty.setText("0");
count_up = itemView.findViewById(R.id.count_up);
count_down = itemView.findViewById(R.id.count_down);
pro_price = itemView.findViewById(R.id.pro_price);
cardView = itemView.findViewById(R.id.packing_card_view);
cardView.setVisibility(View.VISIBLE);
// purchaseQty.setBackground(context.getResources().getDrawable(R.drawable.rectangleborder));
topview = itemView.findViewById(R.id.topview);
topview.setVisibility(View.GONE);
linearLayout = itemView.findViewById(R.id.linearheading);
}
}
}
这是日志错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.cls.kraftpaper,PID: 24722
java.lang.IndexOutOfBoundsException: Index: 3,Size: 3
at java.util.ArrayList.get(ArrayList.java:437)
at com.kraftpaper.handler.activity.packaging.adapter.packagingProductAdapter.onBindViewHolder(packagingProductAdapter.java:71)
at com.kraftpaper.handler.activity.packaging.adapter.packagingProductAdapter.onBindViewHolder(packagingProductAdapter.java:27)
at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3540)
at android.view.View.measure(View.java:24845)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6908)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:24845)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6908)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:24845)
at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1472)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:221)
at android.widget.ScrollView.onMeasure(ScrollView.java:498)
at android.view.View.measure(View.java:24845)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6908)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:24845)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6908)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:221)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
at android.view.View.measure(View.java:24845)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6908)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:24845)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6908)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:221)
at android.view.View.measure(View.java:24845)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6908)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:24845)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6908)
at com.android.internal.policy.DecorView.measureChildWithMargins(DecorView.java:3029)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:221)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:863)
at android.view.View.measure(View.java:24845)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3218)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2004)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2296)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1888)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7908)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1101)
at android.view.Choreographer.doCallbacks(Choreographer.java:917)
at android.view.Choreographer.doFrame(Choreographer.java:847)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1086)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:230)
at android.app.ActivityThread.main(ActivityThread.java:7778)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:526)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)
在这里,我添加了logcat。我得到的结果在那里。
解决方法
那是因为这段代码:
@Override
public int getItemCount() {
return list_data.size() + test_POJO.size();
}
您将返回两个列表的总和:
例如,假设您要返回:return 3 + 3 // total = 6
但是您也尝试访问以下列表中的单个列表:
@Override
public void onBindViewHolder(final packagingProductAdapter.ViewHolder holder,final int position){
final packingProductPOJO listData = list_data.get(position);
final testPOJO test_POJO1 = test_POJO.get(position);
当您在列表上滚动6次时,位置将增加,这是两个列表getItemCount()
的总和,将拖曳 java.lang.IndexOutOfBoundsException: Index: 3,Size: 3
尝试仅返回列表之一的大小:
@Override
public int getItemCount() {
return list_data.size();
}
,
您的getItemCount()方法中的代码是
@Override
public int getItemCount() {
return list_data.size() + test_POJO.size();
}
您返回2个不同的数组大小。 onBindViewHolder()方法具有位置变量。此变量给出项目位置,此位置的范围为 0..getItemCount()。
在onBindViewHolder()方法中,您具有以下代码
final packingProductPOJO listData = list_data.get(position);
final testPOJO test_POJO1 = test_POJO.get(position);
您的getItemCount()方法返回两个不同数组的大小,但是您尝试访问相同的位置。这是Exception的原因。如果数组大小相同,则可以使用此
@Override
public int getItemCount() {
return list_data.size();
}
但如果没有,您可以这样做:
@Override
public int getItemCount() {
return Math.max(list_data.size(),test_POJO.size());
}
在onBindViewHolderMethod()
if (list_data.size() >= position) list_data.get(0);
else list_data.get(position);
if (test_POJO.size() >= position) list_data.get(0);
else test_POJO.get(possition);
但这不是好方法
,尝试一下。
@Override
public int getItemCount() {
return min(list_data.size(),test_POJO.size());
}
它将解决当前问题。但是您会发现RecyclerView
中缺少一些数据。
如果列表中包含相似的元素,则可以将它们组合在一起,然后将它们用作适配器中的一个列表,这样做将避免各种麻烦。
List<PojoClass> combined = new ArrayList<>();
combined.addAll(firstList);
combined.addAll(secondList);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。