在Android中的自定义数组适配器中向EditText添加监听器

时间:2016-05-17 06:30:52

标签: android listadapter

在一项活动中,我有一个CustomListAdapter,其中包含EditText中每行的两个CustomListAdapter字段。目前,我有OnFocusChangeListener更新从EditText获取的值,并将它们保存到数据库中。但是,最后更改的值永远不会更新。保存所有更改的值,但最后一个未保存,因为焦点在修改后从未更改过。用户更改最后一个值,点击"返回",OnFocusChangeListener永远不再被调用;因此,最后一个值不会被保存。

所以我尝试使用AddOnTextChangedListener ...但是,我只能更新CustomListAdapter中的第一个元素。不仅如此,每当我更新第一个元素时,它都会传播到CustomListAdapter中的所有其他元素,并将所有其他行的EditText值设置为第一个EditText领域的价值。每当我改变任何其他行时,都没有任何反应。我看到列表适配器中的每个位置都会调用TextChangeListener,即使文本没有更改。

有没有办法为EditText中的每个CustomListAdapter添加一个监听器,以便它更新EditText中与data[position]对应的每个CustomListAdapter元素。 1}}?

my app

代码段:

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));

    [...]

    }
}

1 个答案:

答案 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我用作参考。 :)