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

标签 android listadapter

在一个 Activity 中,我有一个 CustomListAdapter,其中包含 CustomListAdapter 中每一行的两个 EditText 字段。目前,我有 OnFocusChangeListener 来更新从 EditText 获取的值,并将它们保存到数据库中。但是,最后更改的值永远不会更新。所有更改的值都会保存,但最后一个值不会保存,因为焦点在修改后从未改变。用户更改最后一个值,单击“后退”,OnFocusChangeListener 永远不会再次被调用;因此,最后一个值不会被保存。

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

有没有办法为 CustomListAdapter 中的每个 EditText 添加监听器,以便它更新与正确对应的每个单独的 EditText 元素CustomListAdapter 中的data[position]

my app

代码 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/

相关文章:

Android - 当 Activity 完成时线程会发生什么?

android - 在android中的自定义ListView中绘制矩形

android - attrs.getAttributeIntValue 始终返回默认值

java - Android - Activity 行为?

java - Android 构造函数未定义

android - 如何为 ListView 中的项目生成动态数据

androidx.RecyclerView ListAdapter 非常慢

android - 如何等待 ListAdapter.submitList() 执行并调用 RecyclerView.smoothScrollToPosition(0);

行中带有可点击项目的 Android ListView 会导致继续滚动时出现问题

android - 如何从我在 android 中的应用程序打开 chrome 浏览器的历史窗口?