在一个 Activity 中,我有一个 CustomListAdapter
,其中包含 CustomListAdapter
中每一行的两个 EditText
字段。目前,我有 OnFocusChangeListener
来更新从 EditText
获取的值,并将它们保存到数据库中。但是,最后更改的值永远不会更新。所有更改的值都会保存,但最后一个值不会保存,因为焦点在修改后从未改变。用户更改最后一个值,单击“后退”,OnFocusChangeListener
永远不会再次被调用;因此,最后一个值不会被保存。
所以我尝试使用 AddOnTextChangedListener
...但是,我只能更新 CustomListAdapter
中的第一个元素。不仅如此,每当我更新第一个元素时,它都会传播到 CustomListAdapter
中的所有其余元素,将所有其他行的 EditText
的值设置为第一个 EditText
字段的值。每当我更改任何其他行时,都不会发生任何事情。我看到 TextChangeListener
会为列表适配器中的每个位置调用,即使文本没有更改。
有没有办法为 CustomListAdapter
中的每个 EditText
添加监听器,以便它更新与正确对应的每个单独的 EditText
元素CustomListAdapter
中的data[position]
?
代码 fragment :
public class CustomListAdapter extends ArrayAdapter {
ArrayList data;
[...]
class MyTextWatcher implements TextWatcher {
private int position;
public MyTextWatcher(int position) {
this.position = position;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void afterTextChanged(Editable s) {
arraymap.put(position, Double.valueOf(s.toString()));
}
}
[...]
public View getView(final int position, View convertView, ViewGroup parent) {
final EditText editText1 = (EditText) convertView.findViewById(R.id.edit_text1);
final EditText editText2 = (EditText) convertView.findViewById(R.id.edit_text2);
editText1.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
data[position].save();
}
}
}
});
editText2.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
data[position].save();
}
}
}
});
[...]
//----------------------ALSO TRIED----------------------------
editText1.addTextChangedListener(new MyTextWatcher(position));
[...]
}
}
最佳答案
好的。因此,根据我的评论,我建议简单地创建一个变量,在值更改时临时存储值,然后将其发送到数据库。
但是当我看到你的代码时,你试图将其放在你的 Adapter 类中,我认为这使事情变得复杂。所以我四处寻找如何以更简单的方式实现这一点。
你是 Adapter 类,假设它被 ListView
使用,你实际上可以迭代 ListView 项并从中读取 EditText
的值Activity
其中 ListView
是通过创建一个简单的函数来实现的,如下所示:
private List<SampleObj> retrieveTexts() {
List<SampleObj> sampleObjs = new ArrayList<>();
for (int i = 0; i < lv.getCount(); i++) {
View item = lv.getChildAt(i);
EditText et1 = (EditText) item.findViewById(R.id.et1);
EditText et2 = (EditText) item.findViewById(R.id.et2);
SampleObj so = new SampleObj(et1.getText().toString(), et2.getText().toString());
sampleObjs.add(so);
}
return sampleObjs;
}
这里的SampleObj
只是我作为示例制作的一个类。它只是一个具有两个字符串值的对象(指的是 ListView 项中的两个 EditText
)。
public class SampleObj {
String text1;
String text2;
public SampleObj() {
}
public SampleObj(String text1, String text2) {
this.text1 = text1;
this.text2 = text2;
}
public void setText1(String text1) {
this.text1 = text1;
}
public void setText2(String text2) {
this.text2 = text2;
}
public String getText1() {
return text1;
}
public String getText2() {
return text2;
}
@Override
public String toString() {
return "SampleObject { text1 = " + text1 + ", text2 = " + text2 + "}";
}
}
因此调用 retrieveTexts()
将返回包含您需要的值的 SampleObjs
列表。我记录了我能做的事情,这就是结果:
D/SAMPLE: [SampleObject { text1 = 50, text2 = 0}, SampleObject { text1 = 50, text2 = 0}, SampleObject { text1 = 50, text2 = 0}, SampleObject { text1 = 50, text2 = 0}]
它总是检索 EditText
的当前值。现在您可以决定如何处理收集到的数据(将其发送到数据库)。只要你需要的时候调用它就可以了。干杯! :D
这是一个post我以此作为引用。 :)
关于android - 在 Android 中的自定义数组适配器中向 EditText 添加监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37268718/