在一项活动中,我有一个CustomListAdapter
,其中包含EditText
中每行的两个CustomListAdapter
字段。目前,我有OnFocusChangeListener
更新从EditText
获取的值,并将它们保存到数据库中。但是,最后更改的值永远不会更新。保存所有更改的值,但最后一个未保存,因为焦点在修改后从未更改过。用户更改最后一个值,点击"返回",OnFocusChangeListener
永远不再被调用;因此,最后一个值不会被保存。
所以我尝试使用AddOnTextChangedListener
...但是,我只能更新CustomListAdapter
中的第一个元素。不仅如此,每当我更新第一个元素时,它都会传播到CustomListAdapter
中的所有其他元素,并将所有其他行的EditText
值设置为第一个EditText
领域的价值。每当我改变任何其他行时,都没有任何反应。我看到列表适配器中的每个位置都会调用TextChangeListener
,即使文本没有更改。
有没有办法为EditText
中的每个CustomListAdapter
添加一个监听器,以便它更新EditText
中与data[position]
对应的每个CustomListAdapter
元素。 1}}?
代码段:
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));
[...]
}
}
答案 0 :(得分:2)
好。因此,根据我的评论,我建议只创建一个变量,在变更后临时存储值,然后将其发送到您的数据库。
但是当我看到你的代码时,你正试图在你的Adapter类中使用它,我觉得这很复杂。所以我去看看如何以更简单的方式实现它。
您是适配器类,假设ListView
正在使用它,您实际上可以迭代列表视图项并从{{1}读取EditText
s的值其中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;
}
这里只是我作为样本制作的一个课程。它只是一个具有两个String值的对象(引用listview项中的两个SampleObj
)。
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}]
的当前值。您对收集的数据所做的工作现在取决于您(将其发送到数据库)。只要你需要它就可以打电话。干杯! :d
这里是post我用作参考。 :)