세 개의 편집 텍스트가있는 목록 항목이 하나있는 사용자 지정 목록 어댑터가 있습니다. 그리고 나는 그들 중 한 명에게 데이트 피커를 가지고있다. 날짜가 설정되면 어댑터의 일치 모델에 날짜가 올바르게 저장됩니다. 그러나 다른 편집 텍스트의 경우 입력 한 텍스트를 목록에 저장하기 만하면됩니다. 텍스트 워처를 사용하여 작업을 수행합니다. 내 문제는보기의 단일 항목에 대해 텍스트 관찰자가 여러 번 (정확히 5 번) 발생한다는 것입니다.edittext 및 textwatcher를 사용한 목록보기. Textwatcher가 여러 번 실행됩니다 (3 회 이상)
편집 텍스트 중 하나가 올바르게 작동하면 왜 다른 텍스트가 표시되지 않습니까? 나는 약간의 도움을 정말로 사용할 수있다. 지금까지 어떤 성공도 찾을 수 없었습니다.
public class AddExpensesAdapter extends BaseAdapter{
private Activity activity;
private ArrayList<AddExpensesModel> addExpensesList;
private LayoutInflater inflater;
private TextView totalAmount;
private ArrayList<String> array_amount= new ArrayList<String>();
private ArrayList<String> array_name= new ArrayList<String>();
public AddExpensesAdapter(Activity activity, ArrayList<AddExpensesModel> addExpensesList) {
this.activity = activity;
this.addExpensesList = addExpensesList;
this.inflater = (LayoutInflater) this.activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return addExpensesList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
public AddExpensesModel getExpenseModel(int position)
{
return addExpensesList.get(position);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.a_add_expenses_listitem, null);
viewHolder.expenseName = (EditText) convertView.findViewById(R.id.add_expenses_et_expense_name);
viewHolder.dateTime = (EditText) convertView.findViewById(R.id.add_expenses_et_date_time);
viewHolder.amount = (EditText) convertView.findViewById(R.id.add_expenses_et_amount);
viewHolder.editDate = (ImageView) convertView.findViewById(R.id.add_expenses_edit_date);
viewHolder.number = (TextView) convertView.findViewById(R.id.add_expenses_tv_serial_number);
viewHolder.deleteExpense = (ImageView) convertView.findViewById(R.id.add_expenses_delete_expense);
// viewHolder.totalfriends = (TextView)
// convertView.findViewById(R.id.eventtotalfriends);
convertView.setTag(viewHolder);
viewHolder.ref = position;
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
final AddExpensesModel addExpenseModel = addExpensesList.get(position);
viewHolder.expenseName.setText(addExpenseModel.getExpenseName());
viewHolder.dateTime.setText(addExpenseModel.getDateTime());
viewHolder.amount.setText(addExpenseModel.getAmount());
viewHolder.number.setText(""+(position+1)+".");
viewHolder.editDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
setDate(addExpenseModel);
} catch (Exception e) {
e.printStackTrace();
}
}
});
viewHolder.deleteExpense.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addExpensesList.remove(position);
notifyDataSetChanged();
}
});
viewHolder.amount.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void afterTextChanged(Editable editable) {
if(!editable.toString().equals(""))
{
addExpenseModel.setAmount(editable.toString());
}
notifyDataSetChanged();
}
});
return convertView;
}
public void setDate(final AddExpensesModel model) throws Exception {
final String dateFormatPattern = "MMM, dd yyyy";
final SimpleDateFormat sdf = new SimpleDateFormat(dateFormatPattern,
Locale.getDefault());
DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, monthOfYear);
cal.set(Calendar.DAY_OF_MONTH, dayOfMonth);
model.setDateTime(sdf.format(cal.getTime()));
notifyDataSetChanged();
}
};
Calendar cal = Calendar.getInstance();
cal.setTime(sdf.parse(model.getDateTime()));
new DatePickerDialog(this.activity, date, cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)).show();
}
static class ViewHolder {
EditText expenseName;
EditText dateTime;
EditText amount;
ImageView editDate;
ImageView deleteExpense;
TextView number;
}
}
ListView가 뷰를 재활용하기 때문에 convertview가 null이 아닐 때마다 이미 EditText에 TextWatcher가 첨부되어 있습니다. –
viewHolder.amount.setText 전에 TextWatcher를 제거하려고 시도하면이 콜백도 트리거됩니다. TextWatcher의 단일 인스턴스를 사용하기 위해 일부 논리를 사용하십시오. – Krish
@TomislavNovoselec 감사합니다. –