所以,我有一个自定义适配器,每行都有两个 EditText 字段。
除了将值保存在 ArrayList 中之外,我已经让大多数东西正常工作。
这是我到目前为止所做的代码:
private void holderTitleSavedOnScroll(final int position, IZUICartViewHolder holder) {
if (!(position == (variantArrayList.size() - 1)) && holder.title != null) {
holder.title.setText(variantArrayList.get(position).getVariantTitle());
final int finalPosition = position;
holder.title.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
final EditText newVariant = (EditText) v;
variantArrayList.get(finalPosition).setVariantTitle(newVariant.getText().toString());
}
});
}
}
所以这实际上做了我想要的,它在焦点改变时保存了值。除了一个问题,它只在焦点改变时保存值。
这在大多数情况下都很棒,除非用户实际按下按钮使整个视图消失。焦点从未改变,值也未设置。
所以我猜你们都在想,是的,我们只需调用 addOnTextChangedListener 并附加一个 TextWatcher,通过添加如下内容:
holder.title.setText(variantArrayList.get(position).getVariantTitle());
final int finalPosition = position;
final EditText holderTitle = (EditText) holder.title;
if (holderTitle.getTag() != null) {
final TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
variantArrayList.get(finalPosition).setVariantTitle(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
};
holder.title.addTextChangedListener(textWatcher);
holder.title.setTag(true);
}
不,那也行不通。当然它实际上保存了值,但是当你滚动时它也会弄乱东西,因为列表视图重用了它认为它认为来自一个单元格的值在另一个单元格中的单元格,然后设置来自 ArrayList 的值。
我尝试了不同的方法,例如在更改值和内容时检查焦点,但它不起作用(出于或多或少明显的原因)。
有没有创造性的解决方案来解决这个问题?
更新(使用更多代码):
建议的 TextWatcher 方法:
我的 getView 方法(这里有很多其他与此问题无关的代码):
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
IZUICartViewHolder holder;
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
if (v == null) {
holder = new IZUICartViewHolder();
int type = getItemViewType(position);
switch (type) {
case TYPE_EDIT:
v = inflater.inflate(R.layout.iz_ui_modify_product_cell, parent, false);
holder.title = (EditText) v.findViewById(R.id.iz_prod_modify_variant_title);
holder.title.setHint(addVariantPlaceholder);
holder.deleteButton = v.findViewById(R.id.click_remove);
holder.price = (EditText) v.findViewById(R.id.iz_prod_modify_price);
holder.price.setHint(pricePlaceholder);
holder.price.setText(String.valueOf(0.0));
break;
}
v.setTag(holder);
} else {
holder = (IZUICartViewHolder) v.getTag();
}
hideDeleteButton(holder, position);
holderTitleSavedOnScroll(position, holder);
holderPriceSavedOnScroll(position, holder);
v.setTag(holder);
return v;
}
holderTitleSavedOnScroll 方法
private void holderTitleSavedOnScroll(final int position, IZUICartViewHolder holder) {
if (!(position == (variantArrayList.size() - 1)) && holder.title != null) {
holder.title.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
v.requestFocus();
}
});
final int finalPosition = position;
final EditText holderTitle = (EditText) holder.title;
if (holderTitle != null) {
holder.title.setText(variantArrayList.get(position).getVariantTitle());
}
holderTitle.addTextChangedListener(new EditVariantTextWatcher(variantArrayList.get(finalPosition)));
}
}
TextWatcher 类:
public class EditVariantTextWatcher implements TextWatcher {
private IZUIProductVariantContainer variantContainer;
protected EditVariantTextWatcher(IZUIProductVariantContainer variantContainer) {
this.variantContainer = variantContainer;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
variantContainer.setVariantTitle(s.toString());
}
}