그래서 모든 행에 두 개의 EditText 필드가있는 사용자 지정 어댑터가 있습니다.목록 어댑터에서 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에서 값을 설정합니다.
값과 물건을 변경할 때 포커스를 확인하는 것과 같은 여러 가지 시도를했지만 작동하지 않습니다 (분명한 이유가 있음).
해결할 수있는 창의적인 해결책이 있습니까? (더 코드)
UPDATE :
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());
}
}
기존 TextWatchers를 제거 하시겠습니까? – blahdiblah
시도했지만 작동하지 않았습니다. –