gpt4 book ai didi

android - 带有 edittext 和 textwatcher 的 ListView 。 Textwatcher 触发多次(超过 3 次)

转载 作者:太空宇宙 更新时间:2023-11-03 12:06:52 26 4
gpt4 key购买 nike

我有一个自定义列表适配器,其中一个列表项具有三个编辑文本。我有一个日期选择器供其中之一使用。设置日期后,适配器的相应型号会正确保存日期。但是对于其他编辑文本,我只想将输入的文本存储在列表中。我使用 textwatcher 来完成任务。我的问题是文本观察器针对 View 中的单个条目多次触发(准确地说是 5 次)。

如果其中一个编辑文本工作正常,为什么另一个不能?我真的需要一些帮助。到目前为止,我一直无法找到任何成功。

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;

}

最佳答案

我知道我来晚了,但我会把它留给 future 的读者。将 textwatchers 设置为 listview 项目有点棘手,因为它们的回收性质以及 Textwatchers 被添加到编辑文本而不是被替换。因此,每次创建行 View 或绑定(bind)到新数据时,您都需要删除不正确的并添加新的观察者。尝试以下实现:

  1. 自定义文本观察器。 (对象项是包含你的行数据的对象)

    私有(private)类 CustomWatcher 实现 TextWatcher{私有(private)对象项;

     private CustomWatcher(Object item)
    {
    this.item = item;
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
    {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
    {

    }

    @Override
    public void afterTextChanged(Editable editable)
    {

    }

  2. textwatcher 添加到您的 edittext 并在您的 getView() 函数中删除前一个。

    CustomWatcher oldWatcher = (CustomWatcher)holder.editDate.getTag();如果(旧观察者!= null)holder.editDate.removeTextChangedListener(oldWatcher);

    //在此处使用模型数据填充您的 editText(在添加新的文本观察器之前)

    CustomWatcher newWatcher = new CustomWatcher(rowItem);holder.editDate.setTag(newWatcher);holder.editDate.addTextChangedListener(newWatcher);

完成。您现在可以将文本保存在相应的行数据对象中。这样,当您的 Textwatchers 不再有用时,它们将被删除并防止内存泄漏。

关于android - 带有 edittext 和 textwatcher 的 ListView 。 Textwatcher 触发多次(超过 3 次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27741390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com