#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
, модель неверна.