Nested RecyclerViews wrong position passed

47 Views Asked by At

I have a variation list each item consists of header to collapse the item and option list, every thing works fine if the items is not collapsed, but if they collapsed and reopened to change the option, a worng position is passed to the nested adapter, I tried too many solutions and none of them worked. here is my outer adapter:

void bind(ProductVariation productVariation, int position) {
    LinearLayoutManager manager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false);
    binding.variationOptions.setLayoutManager(manager);
    binding.variationOptions.setRecycledViewPool(recycledViewPool);
//        binding.variationOptions.setHasFixedSize(true);
    binding.variationName.setText(productVariation.getName());
    if (productVariation.getIs_addition() == 1) {
        if (binding.variationOptions.getVisibility() == View.VISIBLE) {
            MultiOptionAdapter multiOptionAdapter = new MultiOptionAdapter(context, productVariation, productVariation.getIs_required(), position);
            binding.variationOptions.setAdapter(multiOptionAdapter);
            binding.minMax.setVisibility(View.VISIBLE);
            if (productVariation.getIs_required() == 0) {
                binding.variationString.setText(R.string.optional);
                binding.minMax.setText(context.getString(R.string.max_options) + productVariation.getMax_options());
            } else {
                binding.minMax.setText(context.getString(R.string.min) + productVariation.getMin_options() + " " + context.getString(R.string.max_options) + productVariation.getMax_options());
            }
        }
    } else {
        if (binding.variationOptions.getVisibility() == View.VISIBLE) {
            SingleOptionAdapter singleOptionAdapter = new SingleOptionAdapter(context, productVariation, position);
            binding.variationOptions.setAdapter(singleOptionAdapter);
            if (productVariation.getIs_required() == 1)
                binding.variationString.setText(R.string.choose_1);
            else
                binding.variationString.setText(R.string.optional);
        }
    }
    double totalAdditions = 0.0;
    for (int i = 0; i < productVariation.getSelectedOptions().size(); i++) {
        if (productVariation.getSelectedOptions().get(i).isSelected()) {
            if (binding.variationOptions.getVisibility() == View.VISIBLE) {
                if (productVariation.getIs_addition() == 0) {
                    binding.variationArrow.setRotation(270);
                    binding.variationOptions.setVisibility(View.GONE);
//                    App.currentProduct.setNetPrice(productVariation.getSelectedOptions().get(i).getSalePrice());
                    binding.variationString.setText(productVariation.getSelectedOptions().get(i).getName());
                } else {
                    if (productVariation.getOptions().get(i).getSalePrice() != null || productVariation.getOptions().get(i).getSalePrice() != 0)
                        totalAdditions = productVariation.getOptions().get(i).getSalePrice();
                    else
                        totalAdditions = productVariation.getOptions().get(i).getPrice();
                    Log.e("checkNetPrice", App.currentProduct.getNetPrice() + " - 2 -");
                    binding.variationString.setText("+" + totalAdditions + context.getString(R.string.egp));
                }
            }
        }
    }
}

Note: if any variation option is selected the item should collapse.
[1]: https://i.stack.imgur.com/LxS8H.png [2]: https://i.stack.imgur.com/T2dN8.png [3]: https://i.stack.imgur.com/Qxi89.png

I expect when any option is selected it's variation item should collapse, also if the user tapped on any item header should collapse too, the outer adapter should pass the correct position at any situation.

0

There are 0 best solutions below