有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

正在使用行循环上的空值调用java EditText的ContextChanged

我有一个RecyclerView,每行有一个EditText。每个EditText都有一个附加的TextWatcher和一个数组中的对象,用于存储有关行和EditText值的信息

我面临的问题是,当行离开屏幕时,它会被回收,但在这个过程中,onTextChanged会被一个空字符串调用,这意味着一个空字符串会被保存到行的信息对象中。当再次加载该行时,它只加载一个空白值,有效地删除了之前EditText中的任何内容。这似乎是非常无用的功能,因为(据我所知)无法区分回收清除和用户实际清除EditText中的值,这使得RecyclerView中的EditText完全无用

我的onBindViewHolder方法如下:

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    int value = indicators.get(position).getValue();

    System.out.println("VALUE: " + indicator.getValue());

    if (value == -1) {
        viewHolder.inputBox.setText("");
    } else {
        viewHolder.inputBox.setText(Integer.toString(value));
    }

    viewHolder.editListener.updatePosition(position);

}

我的TextWatcher是这样的:

private class EditBoxListener implements TextWatcher  {

    private int position;
    private CharSequence sequence;
    private boolean initialCall = true;

    public void updatePosition(int _position) {
        position = _position;
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {}

    @Override
    public void onTextChanged(CharSequence charSequence, int start, int before, int count) {

        System.out.println("TEXT CHANGED TO: " + charSequence.toString());

        if (!initialCall) {
            int value = -1;

            try {
                value = Integer.parseInt(charSequence.toString());
            } catch (Exception e) {}

            if (indicators.size() > 0) {

                indicators.get(position).setValue(value);

            }
        } else {
            initialCall = false;
        }
    }

    @Override
    public void afterTextChanged(Editable editable) {}

}

共 (1) 个答案

  1. # 1 楼答案

    解决这个问题的一种方法是,在对文本进行任何处理之前,简单地检查文本是否为空白,也许是这样的(请原谅我格式不好):

    @Override
    public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
    
    if (!charSequence.equals("")) {
    
        System.out.println("TEXT CHANGED TO: " + charSequence.toString());
    
        if (!initialCall) {
            int value = -1;
    
            try {
                value = Integer.parseInt(charSequence.toString());
            } catch (Exception e) {}
    
            if (indicators.size() > 0) {
    
                indicators.get(position).setValue(value);
    
            }
        } else {
            initialCall = false;
        }
     }
    
    }