Android ListView теряет данные при прокрутке

#android #listview #adapter #android-adapter #baseadapter

#Android #listview #адаптер #android-адаптер #базовая адаптация

Вопрос:

Я использую ListView для отображения текстовых представлений в некоторых строках, а не в других. Я не знаю, сколько там будет элементов, все работает нормально, но при прокрутке вниз отображение изменилось.

Я работаю над приложением, в котором пользователи заполняют отчеты и опросы. В activity у меня есть ListView, в котором дочерние элементы содержат EditTexts, Checkbox и TextView.

Проблема с EditTexts и Checkbox заключалась в том, что при прокрутке содержимое, которое у них есть, теряется. Я смог устранить проблему с флажком, сохранив статус проверки в массиве, но я не могу решить проблему с EditTexts. Я знаю, что есть некоторые вопросы по поводу этой конкретной проблемы, но решения, которые они предоставили, похоже, не работают.

Я использую этот базовый адаптер.

 public class ProductAdapter extends BaseAdapter {

private Context mContext;
private List<Model> models = new ArrayList<>();
private ModelTable avModelTable = new ModelTable();
private BrandTable brandTable = new BrandTable();

public ProductAdapter(Context mContext, List<Model> models) {
    this.mContext = mContext;
    this.models = models;

}


@Override
public int getCount() {
    return models.size();
}

@Override
public Model getItem(int i) {
    return models.get(i);
}

@Override
public long getItemId(int i) {
    return i;
}


@Override
public View getView(int i, View view, ViewGroup viewGroup) {

    ProductHolder item = new ProductHolder();
    View row = view;
    if (row == null) {

        LayoutInflater mInflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        row = mInflater.inflate(R.layout.product_item, viewGroup, false);

        item.nameProduct = (TextView) row.findViewById(R.id.nameProduct);
        item.subCategoryProduct = (TextView) row.findViewById(R.id.subCategoryProduct);
        item.productGroup = (RadioGroup) row.findViewById(R.id.groupRadioProduct);
        item.oos_product = (RadioButton) row.findViewById(R.id.oos_product);
        item.av_product = (RadioButton) row.findViewById(R.id.av_product);
        item.shelfProduct = (EditText) row.findViewById(R.id.shelfProduct);
        item.quantityProduct = (EditText) row.findViewById(R.id.quantityProduct);
        item.priceProduct = (EditText) row.findViewById(R.id.priceProduct);
        item.layoutBrand = (LinearLayout) row.findViewById(R.id.layoutBrand);
        item.avBrand = (EditText) row.findViewById(R.id.avBrand);


        row.setTag(item);
    } else {
        item = (ProductHolder) row.getTag();
    }

    final Model model = models.get(i);

    item.nameProduct.setText(model.getProduct_name());
    item.subCategoryProduct.setText(brandTable.getBrandName(model.getBrand_id()));

    if (model.getQuantity() != 0) {
        item.quantityProduct.setText(String.valueOf(model.getQuantity()));
    }
    if (model.getShelf() != 0) {
        item.shelfProduct.setText(String.valueOf(model.getShelf()));
    }

    if (model.getPrice() != null) {
        item.priceProduct.setText(model.getPrice());
    }

    if (model.getBrand_id() == 1) {

        item.layoutBrand.setVisibility(View.GONE);
        item.avBrand.setVisibility(View.GONE);
        item.productGroup.setVisibility(View.VISIBLE);
        item.oos_product.setVisibility(View.VISIBLE);
        item.av_product.setVisibility(View.VISIBLE);

        switch (model.getAv()) {
            case 0:
                item.oos_product.setChecked(true);
                break;
            case 1:
                item.av_product.setChecked(true);
                break;
            default:
                break;
        }

        item.productGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                switch (i) {
                    case R.id.oos_product:
                        avModelTable.updateAv(model.getId(), 0);
                        break;
                    case R.id.av_product:
                        avModelTable.updateAv(model.getId(), 1);
                        break;
                    default:
                        break;
                }

            }

        });


    } else {


        item.layoutBrand.setVisibility(View.VISIBLE);
        item.avBrand.setVisibility(View.VISIBLE);
        item.productGroup.setVisibility(View.GONE);
        item.oos_product.setVisibility(View.GONE);
        item.av_product.setVisibility(View.GONE);


        item.avBrand.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                          int arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
                if (arg0.toString().equals("")) {
                    avModelTable.updateAv(model.getId(), 0);
                } else avModelTable.updateAv(model.getId(), Integer.parseInt(arg0.toString()));

            }
        });

    }


    item.shelfProduct.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                      int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub
            if (arg0.toString().equals("")) {
                avModelTable.updateShelf(model.getId(), 0);
            } else avModelTable.updateShelf(model.getId(), Integer.parseInt(arg0.toString()));

        }
    });

    item.quantityProduct.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                      int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub
            if (arg0.toString().equals("")) {
                avModelTable.updateQuantity(model.getId(), 0);
            } else
                avModelTable.updateQuantity(model.getId(), Integer.parseInt(arg0.toString()));

        }
    });

    item.priceProduct.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                      int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub
            if (arg0.toString().equals("")) {
                avModelTable.updatePrice(model.getId(), null);
            } else
                avModelTable.updatePrice(model.getId(), arg0.toString());

        }
    });


    return row;
}


private class ProductHolder {
    private TextView nameProduct, subCategoryProduct;
    private RadioButton oos_product, av_product;
    private RadioGroup productGroup;
    private EditText shelfProduct, quantityProduct, priceProduct, avBrand;
    private LinearLayout layoutBrand;

}
  

}

Комментарии:

1. есть ли у вас какие-либо решения для этого??? У меня здесь такая же проблема: (

Ответ №1:

Я сделал тестовый код, используя ваш адаптер, но с разными представлениями / моделями, и попробовал, но это не сработало. Это сработало только после того, как я заменил View row = view ; с View row = null; в начале вашего getView метода, заставляя код каждый раз раздувать представления. Вот почему я считаю, что проблема в item = (ProductHolder) row.getTag(); части. Возможно ProductHolder , модель неверна.