[英]How to use two arraylist in adapter recyclerview
我想在同一個適配器中使用兩個數組列表,但出現錯誤。 它沒有設置值,我得到了 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", category_id, 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", String.valueOf(quantity), finalProduct_ID, "manual", category_id, holder.purchaseQty, position, "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, "Insufficent Stock ", Toast.LENGTH_LONG).show();
}else {
// context.add("pk@gmail.com", String.valueOf(quantity), finalProduct_ID, "manual", category_id, holder.purchaseQty, position, 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() 方法返回兩個不同數組的大小,但您嘗試訪問相同的位置。 這是異常的原因。 如果數組大小相同,您可以使用它
@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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.