具有多个视图的 Recyclerview,删除 addTextChangedListener() 不起作用

Recyclerview with more than one views, Removing of addTextChangedListener() not working

我正在开发一个 android 应用程序,我在手动更改 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.

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

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

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

在以编程方式更改任何 EditText 的值之前,我通过使用 removeTextChangedListener() 删除每个 TextWatcher 对象上的 addTextChangedListener() 以避免自行调用该函数。更改值并重新注册监听器后。

数量EditText

 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);
    }
};

出售价格EditText

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;
    }
}

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

我试图找出确切的问题,但无法做到。

我的适配器ClassAdapterSaleEditable.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<>();
    }
}

我该如何解决这个问题。

-感谢您的帮助!

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 行将被调用时都会调用此方法 displayed/recycled/changed/inserted 屏幕上;每当您添加新项目时,这显然都会发生。

因此,可能的方法是将这些侦听器注册到其他地方,以便调用一次或任何时候调用;即不是每次行都被回收。

您可以在 EditText's 自身的 ViewHolder 构造函数中执行此操作。

挑战:我们如何知道用户修改了哪个EditText? .. 好像某些 EditText 被修改并且您回收了视图(即滚动 up/down 列表),您会看到该值在多行中混乱。

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

  • 跟踪模型中的 EditText 值 class ModelSale.. 不 确定你是否已经这样做了..无论如何这个 class 应该有 字段、getter 和 setter 对应于 EditTexts 个字段 我们有 (quantity, discount, & 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 观察者相关的所有观察者、字段和方法从 RecyclerViewAdapter 移动到 ViewHolder

并且每次更改这些 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();

        }
    }
}