有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有多个视图的java Recyclerview,删除addTextChangedListener()无效

我正在一个安卓应用程序上工作,在手动更改EditText的值时,我会以编程方式更改一些EditText的值

  • When user change the quantity I am changing the total price & sale price value.
  • When user change the sale price I am changing the discount value.
  • When user change the discount I am changing the sale price value.

enter image description here

我在每个EditText上添加了一个addTextChangedListener()。但在此之前,我已经为每个EditText的全局对象创建了TextWatcher对象

private TextWatcher quantityWatcher;
private TextWatcher priceWatcher;
private TextWatcher discountWatcher;

并定义它的onBindViewHolder()方法,这样每当我想在它上面删除或添加一个TextChangedListener()时,我都可以轻松地完成

在以编程方式更改任何EditText的值之前,我正在使用removeTextChangedListener()删除每个TextWatcher对象上的addTextChangedListener(),以避免函数本身调用。更改值并注册回侦听器之后

对于数量编辑文本

 quantityWatcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
        Log.d("SocialCodia", "afterTextChanged: quantityWatcher Event Listener Called");
        quantityEvent(holder);
    }
};

用于折扣编辑文本

priceWatcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
        Log.d("SocialCodia", "afterTextChanged: priceWatcher Event Listener Called");
        priceEvent(holder);
    }
};

销售价格编辑文本

discountWatcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
        Log.d("SocialCodia", "afterTextChanged: discountWatcher Event Listener Called");
        discountInputEvent(holder);
    }
};

我正在调用的方法更改EditText的值

private void priceEvent(ViewHolder holder) {
    Log.d("SocialCodia", "PriceEvent Method Called");
    unregisterTextWatcher(holder);
    int totalPrice = Integer.parseInt(holder.inputTotalPrice.getText().toString().trim());
    String sellPriceString = holder.inputSalePrice.getText().toString().trim();
    if (sellPriceString.trim().length()>0)
    {
        int sellPrice = Integer.parseInt(holder.inputSalePrice.getText().toString().trim());
        int discount = percentage(sellPrice, totalPrice);
        holder.inputSaleDiscount.setText(String.valueOf(discount));
    }
    else
    {
        holder.inputSaleDiscount.setText(String.valueOf(100));
    }
    registerTextWatchers(holder);
}

private void quantityEvent(ViewHolder holder)
{
    Log.d("SocialCodia", "quantityEvent Method Called");
    unregisterTextWatcher(holder);
    String quan = holder.inputSaleQuantity.getText().toString().trim();
    String per = holder.inputSaleDiscount.getText().toString().trim();
    int quantity;
    int percentage;
    if (quan == null || quan.length()<1 || quan.isEmpty())
        quantity = 1;
    else
        quantity = Integer.parseInt(quan);
    if (per==null || per.length()<1)
        percentage = 0;
    else
        percentage = Integer.parseInt(per);
    int price = Integer.parseInt(holder.tvProductPrice.getText().toString());
    int finalPrice = price*quantity;
    holder.inputTotalPrice.setText(String.valueOf(finalPrice));
    int salePrice = percentageDec(finalPrice,percentage);
    holder.inputSalePrice.setText(String.valueOf(salePrice));
    registerTextWatchers(holder);
}

private void discountInputEvent(ViewHolder holder) {
    Log.d("SocialCodia", "discountInputEvent Method Called");
    unregisterTextWatcher(holder);
    int totalPrice = Integer.parseInt(holder.inputTotalPrice.getText().toString().trim());
    String per = holder.inputSaleDiscount.getText().toString().trim();
    int percentage;
    if (per==null || per.length()<1)
        percentage = 0;
    else
        percentage = Integer.parseInt(per);
    int price = percentageDec(totalPrice, percentage);
    holder.inputSalePrice.setText(String.valueOf(price));
    registerTextWatchers(holder);
}

private int percentage(int partialValue, int totalValue) {
    Log.d("SocialCodia", "percentage Method Called");
    Double partial = (double) partialValue;
    Double total = (double) totalValue;
    Double per = (100 * partial) / total;
    Double p = 100 - per;
    return p.intValue();
}

private int percentageDec(int totalValue, int per) {
    Log.d("SocialCodia", "percentageDec Method Called");
    if (per == 0 || String.valueOf(per).length() < 0)
        return totalValue;
    else {
        Double total = (double) totalValue;
        Double perc = (double) per;
        Double price = (total - ((perc / 100) * total));
        Integer p = price.intValue();
        return p;
    }
}

每种条件、逻辑或方法都运行良好。但是当我在^{中插入多个视图时。更改任何行EditText的值,除了当前插入的视图一次又一次地调用侦听器本身

0

我曾试图找出确切的问题,但无法解决

我的适配器类AdapterSaleEditable.java

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

    private Context context;
    private List<ModelSale> modelSaleList;
    private String token;
    private SharedPrefHandler sp;
    private ModelUser user;
    private boolean discountFlag = false;
    private boolean priceEvenFlag = false;
    private TextWatcher quantityWatcher;
    private TextWatcher priceWatcher;
    private TextWatcher discountWatcher;

    public AdapterSaleEditable(Context context, List<ModelSale> modelSales) {
        this.context = context;
        this.modelSaleList = modelSales;
        sp = SharedPrefHandler.getInstance(context);
        user = sp.getUser();
        token = user.getToken();
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.row_sale_editable, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        ModelSale sale = modelSaleList.get(position);
        int productId = sale.getProductId();
        int saleId = sale.getSaleId();
        String productCategory = sale.getProductCategory();
        String productName = sale.getProductName();
        String productSize = sale.getProductSize();
        String productBrand = sale.getProductBrand();
        int productPrice = sale.getProductPrice();
        int productQuantity = sale.getProductQuantity();
        String productManufacture = sale.getProductManufacture();
        String productExpire = sale.getProductExpire();
        String createdAt = sale.getCreatedAt();

        holder.tvProductName.setText(productName);
        holder.tvProductSize.setText("(" + productSize + ")");
        holder.tvProductCategory.setText(productCategory);
        holder.tvProductPrice.setText(String.valueOf(productPrice));
        holder.inputTotalPrice.setText(String.valueOf(productPrice));
        holder.inputSaleQuantity.setText(String.valueOf(1));
        holder.inputSalePrice.setText(String.valueOf(productPrice));
        holder.inputSaleDiscount.setText(String.valueOf(0));
        holder.tvProductBrand.setText(productBrand);
        holder.tvProductManufacture.setText(productManufacture);
        holder.tvProductExpire.setText(productExpire);
        holder.tvCount.setText(String.valueOf(position + 1));

        holder.cvSell.setOnLongClickListener(view -> {
            showDeleteAlert(holder, sale, position);
            return true;
        });


         quantityWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
                Log.d("SocialCodia", "afterTextChanged: quantityWatcher Event Listener Called");
                quantityEvent(holder);
            }
        };


         priceWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
                Log.d("SocialCodia", "afterTextChanged: priceWatcher Event Listener Called");
                priceEvent(holder);
            }
        };


         discountWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
                Log.d("SocialCodia", "afterTextChanged: discountWatcher Event Listener Called");
                discountInputEvent(holder);
            }
        };


        registerTextWatchers(holder);
        //End on create method
    }

    private void registerTextWatchers(ViewHolder holder) {
        Log.d("SocialCodia", "Registring Listener");
        holder.inputSaleQuantity.addTextChangedListener(quantityWatcher);
        holder.inputSalePrice.addTextChangedListener(priceWatcher);
        holder.inputSaleDiscount.addTextChangedListener(discountWatcher);
    }

    private void unregisterTextWatcher(ViewHolder holder)
    {
        Log.d("SocialCodia", "UnRegistring Listener");
        holder.inputSaleQuantity.removeTextChangedListener(quantityWatcher);
        holder.inputSalePrice.removeTextChangedListener(priceWatcher);
        holder.inputSaleDiscount.removeTextChangedListener(discountWatcher);
    }


    private void priceEvent(ViewHolder holder) {
        Log.d("SocialCodia", "PriceEvent Method Called");
        unregisterTextWatcher(holder);
        int totalPrice = Integer.parseInt(holder.inputTotalPrice.getText().toString().trim());
        String sellPriceString = holder.inputSalePrice.getText().toString().trim();
        if (sellPriceString.trim().length()>0)
        {
            int sellPrice = Integer.parseInt(holder.inputSalePrice.getText().toString().trim());
            int discount = percentage(sellPrice, totalPrice);
            holder.inputSaleDiscount.setText(String.valueOf(discount));
        }
        else
        {
            holder.inputSaleDiscount.setText(String.valueOf(100));
        }
        registerTextWatchers(holder);
    }

    private void quantityEvent(ViewHolder holder)
    {
        Log.d("SocialCodia", "quantityEvent Method Called");
        unregisterTextWatcher(holder);
        String quan = holder.inputSaleQuantity.getText().toString().trim();
        String per = holder.inputSaleDiscount.getText().toString().trim();
        int quantity;
        int percentage;
        if (quan == null || quan.length()<1 || quan.isEmpty())
            quantity = 1;
        else
            quantity = Integer.parseInt(quan);
        if (per==null || per.length()<1)
            percentage = 0;
        else
            percentage = Integer.parseInt(per);
        int price = Integer.parseInt(holder.tvProductPrice.getText().toString());
        int finalPrice = price*quantity;
        holder.inputTotalPrice.setText(String.valueOf(finalPrice));
        int salePrice = percentageDec(finalPrice,percentage);
        holder.inputSalePrice.setText(String.valueOf(salePrice));
        registerTextWatchers(holder);
    }

    private void discountInputEvent(ViewHolder holder) {
        Log.d("SocialCodia", "discountInputEvent Method Called");
        unregisterTextWatcher(holder);
        int totalPrice = Integer.parseInt(holder.inputTotalPrice.getText().toString().trim());
        String per = holder.inputSaleDiscount.getText().toString().trim();
        int percentage;
        if (per==null || per.length()<1)
            percentage = 0;
        else
            percentage = Integer.parseInt(per);
        int price = percentageDec(totalPrice, percentage);
        holder.inputSalePrice.setText(String.valueOf(price));
        registerTextWatchers(holder);
    }

    private int percentage(int partialValue, int totalValue) {
        Log.d("SocialCodia", "percentage Method Called");
        Double partial = (double) partialValue;
        Double total = (double) totalValue;
        Double per = (100 * partial) / total;
        Double p = 100 - per;
        return p.intValue();
    }

    private int percentageDec(int totalValue, int per) {
        Log.d("SocialCodia", "percentageDec Method Called");
        if (per == 0 || String.valueOf(per).length() < 0)
            return totalValue;
        else {
            Double total = (double) totalValue;
            Double perc = (double) per;
            Double price = (total - ((perc / 100) * total));
            Integer p = price.intValue();
            return p;
        }
    }

    private void showDeleteAlert(ViewHolder holder, ModelSale sale, int position) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle("Are you sure want to delete?");
        builder.setMessage("You are going to delete " + sale.getProductName() + ". The Sale Quantity of this product was " + sale.getSaleQuantity() + " and the total price was " + sale.getSalePrice());
        builder.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                deleteSoldProduct(sale.getSaleId(), position);
            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Toast.makeText(context, "Deletion Canceled", Toast.LENGTH_SHORT).show();
            }
        });
        builder.show();
    }

    private void deleteSoldProduct(int sellId, int position) {
        Call<ResponseDefault> call = ApiClient.getInstance().getApi().deleteSoldProduct(sellId, token);
        call.enqueue(new Callback<ResponseDefault>() {
            @Override
            public void onResponse(Call<ResponseDefault> call, Response<ResponseDefault> response) {
                if (response.isSuccessful()) {
                    ResponseDefault responseDefault = response.body();
                    if (!responseDefault.isError()) {
                        TastyToast.makeText(context, responseDefault.getMessage(), Toast.LENGTH_SHORT, TastyToast.SUCCESS);
                        Helper.playSuccess();
                        Helper.playVibrate();
                        modelSaleList.remove(position);
                        notifyItemRemoved(position);
                        notifyItemRangeChanged(position, modelSaleList.size());
                    } else
                        TastyToast.makeText(context, responseDefault.getMessage(), Toast.LENGTH_SHORT, TastyToast.ERROR);
                } else
                    Toast.makeText(context, "Request Isn't Success", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFailure(Call<ResponseDefault> call, Throwable t) {
                t.printStackTrace();
            }
        });
    }

    public void updateList(List<ModelSale> list) {
        modelSaleList = list;
        notifyDataSetChanged();
    }

    @Override
    public int getItemCount() {
        return modelSaleList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView tvProductName, tvProductSize, tvProductCategory, tvSaleTime, tvProductPrice, tvProductBrand, tvProductManufacture, tvProductExpire, tvCount;
        private EditText inputSaleQuantity, inputSaleDiscount, inputSalePrice, inputTotalPrice;
        private CardView cvSell;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tvProductName = itemView.findViewById(R.id.tvProductName);
            tvProductSize = itemView.findViewById(R.id.tvProductSize);
            tvProductCategory = itemView.findViewById(R.id.tvProductCategory);
            tvSaleTime = itemView.findViewById(R.id.tvSaleTime);
            tvProductPrice = itemView.findViewById(R.id.tvProductPrice);
            inputSaleQuantity = itemView.findViewById(R.id.inputSaleQuantity);
            inputSaleDiscount = itemView.findViewById(R.id.inputSaleDiscount);
            inputSalePrice = itemView.findViewById(R.id.inputSalePrice);
            tvProductBrand = itemView.findViewById(R.id.tvProductBrand);
            tvProductManufacture = itemView.findViewById(R.id.tvProductManufacture);
            tvProductExpire = itemView.findViewById(R.id.tvProductExpire);
            inputTotalPrice = itemView.findViewById(R.id.inputTotalPrice);
            tvCount = itemView.findViewById(R.id.tvCount);
            cvSell = itemView.findViewById(R.id.cvSell);
        }
    }
}

我的碎片。我正在设置recyclerview的位置SellProductFragment.java

public class SellProductActivity extends AppCompatActivity {

    private ImageView ivCloseDialog;
    private RecyclerView recyclerView;
    private EditText inputSearchProduct;
    private static List<ModelProduct> modelProductList;
    private AdapterProductSale adapterProductSale;
    private int productId;
    private ActionBar actionBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sell_product);
        init();
        actionBar = getSupportActionBar();
        actionBar.setTitle("Sell Product");

        setRecyclerView();

        inputSearchProduct.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
                filter(editable.toString());
            }
        });

    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_close,menu);
        return super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int id = item.getItemId();
        if (id==R.id.miClose)
        {
            onBackPressed();
        }
        return super.onOptionsItemSelected(item);
    }

    private void filter(String text)
    {
        List<ModelProduct> p = new ArrayList<>();
        for(ModelProduct sale : modelProductList)
        {
            if (sale.getProductName().toLowerCase().trim().contains(text.toLowerCase()))
            {
                p.add(sale);
            }
        }
        adapterProductSale.updateList(p);
    }

    private void setRecyclerView() {
        LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(layoutManager);
        modelProductList = DbHandler.getModelProductList();
        adapterProductSale = new AdapterProductSale(SellProductActivity.this, modelProductList);
        recyclerView.setAdapter(adapterProductSale);
    }


    private void init() {
        recyclerView = findViewById(R.id.rvProducts);
        inputSearchProduct = findViewById(R.id.inputSearchProduct);
        modelProductList = new ArrayList<>();
    }
}

我怎样才能解决这个问题

-谢谢你的帮助


共 (1) 个答案

  1. # 1 楼答案

    But when I am inserting more than one views in recyclerview. Changing of any rows EditText's value except the current inserted views calling the listener itself again and again.

    监听器复制的主要问题是,这些监听器存在于onBindViewHolder()中,因为每次在屏幕上显示/回收/更改/插入RecyclerView行时都会调用这个方法;这显然发生在你添加新项目的时候

    所以,可能的方法是在其他地方注册这些听众,这些听众将被调用一次,或者在你想调用的任何时候;i、 e.不是每次都回收这些行

    您可以在ViewHolder构造函数中对EditText's本身执行此操作

    挑战:我们如何知道用户修改了哪个EditText。。就好像某些EditText被修改了,而您又重新使用了视图(即,在列表中向上/向下滚动),您将看到该值在多行中混乱不堪

    这可以通过以下方式解决:

    • 跟踪模型类EditText中的ModelSale值。。不 当然,如果你已经这么做了。。无论如何,这门课应该 字段、getter和;setter对应于EditTexts字段 我们有(quantitydiscount,&;price)。这些领域应该 在onBindViewHoder()中设置,以便随时获取保存的值 这些排是回收的
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            ModelSale sale = modelSaleList.get(position);
    
            // ...... rest of your code
            
            holder.unregisterTextWatcher();
            
            holder.inputSaleQuantity.setText(sale.getQuantatiy());
            holder.inputSaleDiscount.setText(sale.getDiscount());
            holder.inputSalePrice.setText(sale.getPrice());
            
            holder.registerTextWatchers();
    
            //End on create method
        }
    
    • 使用getAdapterPostion()获取ViewHolder中的当前项

    这种方法需要移动所有观察者、字段和;与EditText观察者相关的方法,从RecyclerViewAdapterViewHolder

    每次在更改这些EditTexts字段之前,您都需要注销文本监视程序

    为了紧凑起见,这里的适配器只做了这些修改

    public class AdapterSaleEditable extends RecyclerView.Adapter<AdapterSaleEditable.ViewHolder> {
    
       // ... your code
    
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            ModelSale sale = modelSaleList.get(position);
    
            // ...... rest of your code
            
            holder.unregisterTextWatcher();
            
            holder.inputSaleQuantity.setText(sale.getQuantatiy());
            holder.inputSaleDiscount.setText(sale.getDiscount());
            holder.inputSalePrice.setText(sale.getPrice());
            
            holder.registerTextWatchers();
    
            //End on create method
        }
    
        public class ViewHolder extends RecyclerView.ViewHolder {
            private TextView tvProductName, tvProductSize, tvProductCategory, tvSaleTime, tvProductPrice, tvProductBrand, tvProductManufacture, tvProductExpire, tvCount;
            private EditText inputSaleQuantity, inputSaleDiscount, inputSalePrice, inputTotalPrice;
            private CardView cvSell;
    
            private TextWatcher quantityWatcher;
            private TextWatcher priceWatcher;
            private TextWatcher discountWatcher;
    
            private void registerTextWatchers() {
                Log.d("SocialCodia", "Registring Listener");
                inputSaleQuantity.addTextChangedListener(quantityWatcher);
                inputSalePrice.addTextChangedListener(priceWatcher);
                inputSaleDiscount.addTextChangedListener(discountWatcher);
            }
    
            private void unregisterTextWatcher() {
                Log.d("SocialCodia", "UnRegistring Listener");
                inputSaleQuantity.removeTextChangedListener(quantityWatcher);
                inputSalePrice.removeTextChangedListener(priceWatcher);
                inputSaleDiscount.removeTextChangedListener(discountWatcher);
            }
    
            private void priceEvent() {
                Log.d("SocialCodia", "PriceEvent Method Called");
                unregisterTextWatcher();
                int totalPrice = Integer.parseInt(inputTotalPrice.getText().toString().trim());
                String sellPriceString = inputSalePrice.getText().toString().trim();
                if (sellPriceString.trim().length() > 0) {
                    int sellPrice = Integer.parseInt(inputSalePrice.getText().toString().trim());
                    int discount = percentage(sellPrice, totalPrice);
                    inputSaleDiscount.setText(String.valueOf(discount));
                } else {
                    inputSaleDiscount.setText(String.valueOf(100));
                }
                registerTextWatchers();
            }
    
            private void quantityEvent() {
                Log.d("SocialCodia", "quantityEvent Method Called");
                unregisterTextWatcher();
                String quan = inputSaleQuantity.getText().toString().trim();
                String per = inputSaleDiscount.getText().toString().trim();
                int quantity;
                int percentage;
                if (quan == null || quan.length() < 1 || quan.isEmpty())
                    quantity = 1;
                else
                    quantity = Integer.parseInt(quan);
                if (per == null || per.length() < 1)
                    percentage = 0;
                else
                    percentage = Integer.parseInt(per);
                int price = Integer.parseInt(tvProductPrice.getText().toString());
                int finalPrice = price * quantity;
                inputTotalPrice.setText(String.valueOf(finalPrice));
                int salePrice = percentageDec(finalPrice, percentage);
                inputSalePrice.setText(String.valueOf(salePrice));
                registerTextWatchers();
            }
    
            private void discountInputEvent() {
                Log.d("SocialCodia", "discountInputEvent Method Called");
                unregisterTextWatcher();
                int totalPrice = Integer.parseInt(inputTotalPrice.getText().toString().trim());
                String per = inputSaleDiscount.getText().toString().trim();
                int percentage;
                if (per == null || per.length() < 1)
                    percentage = 0;
                else
                    percentage = Integer.parseInt(per);
                int price = percentageDec(totalPrice, percentage);
                inputSalePrice.setText(String.valueOf(price));
                registerTextWatchers();
            }
    
            private int percentage(int partialValue, int totalValue) {
                Log.d("SocialCodia", "percentage Method Called");
                Double partial = (double) partialValue;
                Double total = (double) totalValue;
                Double per = (100 * partial) / total;
                Double p = 100 - per;
                return p.intValue();
            }
    
            private int percentageDec(int totalValue, int per) {
                Log.d("SocialCodia", "percentageDec Method Called");
                if (per == 0 || String.valueOf(per).length() < 0)
                    return totalValue;
                else {
                    Double total = (double) totalValue;
                    Double perc = (double) per;
                    Double price = (total - ((perc / 100) * total));
                    Integer p = price.intValue();
                    return p;
                }
            }
    
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                
                // Rest of your code
    
                // Text Watchers
                
                quantityWatcher = new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
                    }
    
                    @Override
                    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
                    }
    
                    @Override
                    public void afterTextChanged(Editable editable) {
                        Log.d("SocialCodia", "afterTextChanged: quantityWatcher Event Listener Called");
                        quantityEvent();
                    }
                };
    
                priceWatcher = new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
                    }
    
                    @Override
                    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
                    }
    
                    @Override
                    public void afterTextChanged(Editable editable) {
                        Log.d("SocialCodia", "afterTextChanged: priceWatcher Event Listener Called");
                        priceEvent();
                    }
                };
    
    
                discountWatcher = new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
                    }
    
                    @Override
                    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
                    }
    
                    @Override
                    public void afterTextChanged(Editable editable) {
                        Log.d("SocialCodia", "afterTextChanged: discountWatcher Event Listener Called");
                        discountInputEvent();
                    }
                };
    
                registerTextWatchers();
    
            }
        }
    }