- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个自定义列表适配器,其中一个列表项具有三个编辑文本。我有一个日期选择器供其中之一使用。设置日期后,适配器的相应型号会正确保存日期。但是对于其他编辑文本,我只想将输入的文本存储在列表中。我使用 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)到新数据时,您都需要删除不正确的并添加新的观察者。尝试以下实现:
自定义文本观察器。 (对象项是包含你的行数据的对象)
私有(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)
{
}
将 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/
什么情况下应该使用afterTextChanged而不是onTextChanged,反之亦然? 最佳答案 这些事件按以下顺序调用: beforeTextChanged(CharSequence s,
我正在做一个聊天应用程序,并了解如何制作 textWatcher,它将在用户输入的情况下推送 firebase 数据结构.我想推送一个数据结构,在该数据结构上您将看到用户是否正在输入。当用户键入时,用
我有一个自定义列表适配器,其中一个列表项具有三个编辑文本。我有一个日期选择器供其中之一使用。设置日期后,适配器的相应型号会正确保存日期。但是对于其他编辑文本,我只想将输入的文本存储在列表中。我使用 t
我正在尝试让 TextWatcher 与 AutoCompleteTextView 一起工作,但遇到了一些问题。我面临的问题是,当我开始输入文本时,如果数据输入的长度只有一个字符,我在 AutoCom
自从我开始使用 TextWatcher 以来,我的应用程序不断崩溃...正如你在下面看到的,我为 3 个 EditText 字段创建了一个 TextWatcher...我做了一个按钮来监听 3 个 E
我正在尝试配置一个简单的表单。我有 3 个编辑文本,在用户结束输入后,我想显示选中的图标(如果有效)(并转到下一个字段),如果无效则显示错误,用户可以更正。 我的主要问题是我只能输入 1 个字符,然后
我的 Android 应用程序上有一个 TextWatcher。问题是我希望它监听每个文本更改,并 append 一个相同的 TextView 字符串。 例如,用户在 EditText 字段上输入 A
我已将 TextWatcher 添加到 EditText 并通过 onTextChanged(CharSequence s, int start, int before, int count) 方法监
在我按下退格键之后,我的 textwatcher 开始工作,然后那个建议出现了。我有一个 textwatcher,可以从网络生成书籍列表。我也等着看它是否是一个网络问题。但我发现不是因为那个,当我按退
我正在尝试过滤 gridview,为此我在编辑框中输入数据。它工作得很好,除了当我在编辑框中插入一个空格字符时,它不知何故无法识别它并且结果集为空。请帮忙 这是我的编辑框监听器: search.add
我在 EditText 字段上有提示文本和普通文本,我指定了不同的 Font-Size、Font-Color、Font-Name 两者。我已经把它放在我的 ActivityClass 中,它工作正常。
我有两个编辑文本,我想在编辑另一个文本的同时更改一个文本,反之亦然。我使用了 TextWatcher,它或多或少是这样的: //MUDAR AO DIGITAR edt1.addTe
我是 Android 开发的新手,目前正在开发一款应用程序,该应用程序允许人们在框中键入文本,文本会显示在屏幕上的位图上。 我在监听变化的 Activity 中有一个文本框。每次键入文本时,它都会调用
每次将“q”写入我附加 TextWatcher 的编辑文本的最后一个字符时,“q”就会被“a”替换。我使用: public void afterTextChanged(Editable s) {
我的代码看起来很简单,但我不知道问题出在哪里。如果我编写这样的代码: tvResult.setText(sum+ "RUB"); 它显示了正确的数字。但如果我尝试添加这样的 IF 语句: if(sum
在我的应用程序中,我将 TextWatcher 放在 EditText 上。当我更改 EditText 的文本时,TextWatcher 的事件被调用两次。 我正在使用模拟器来运行该应用程序。 最佳答
我有一个 Android 编程问题。使用下面的代码我想验证一个字符串匹配。它验证正常,但 LogCat 显示 TextWatcher 方法在每次击键时触发两次,我不明白为什么。我希望每次击键只触发一次
TextWatcher 有一个烦人的问题。我一直在网上搜索,但找不到任何东西。如果有人可以帮助我,将不胜感激。 出于某种原因,在一个文本更改时调用 TextWatcher 事件是不稳定的。有时它们会被
在我的应用程序中,我想跟踪 EditText 中的输入。每次用户修改 EditText 中的字符时,我想跟踪: 如果添加/删除了字符 添加/删除字符的索引以及 添加/删除了什么字符 我使用TextWa
我想使用 TextWatcher 为多个 editText 编写一个 validator 。 我已经有方法来验证用户写入的数据是否正确。还添加了验证来检查 editText 是否为空。但这里它没有像我
我是一名优秀的程序员,十分优秀!