簡體   English   中英

如何在adapter recyclerview中使用兩個arraylist

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM