编辑文本将在滚动时失去其价值



我一直在网上寻找可能的答案。我找到了一个,但它会在滚动时不断更改其值。我不知道我的代码的哪一部分使它发生变化。我的定制ListView中有一个EditTextTextViewTextView将保存数据库中的学生列表,EditText用户将输入相应学生的分数。这是我的代码

public class RecordAdapter extends ArrayAdapter<String>{
    private final Context context;
      private final String[] values;
      String value;
      public RecordAdapter(Context context, String[] values) {
        super(context, R.layout.row1, values);
        this.context = context;
        this.values = values;
      }       
      @Override
      public View getView(final int position, View convertView, ViewGroup parent) {
          value = "0";
          final ViewHolder holder;
          if (convertView == null) {
                holder = new ViewHolder();
                LayoutInflater inflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.row1, null);
                holder.scoreEditText = (EditText) convertView.findViewById(R.id.scores);
                holder.nameTextView = (TextView)convertView.findViewById(R.id.name);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
          holder.nameTextView.setText(value);
           holder.nameTextView.setText(values[position]);
           holder.scoreEditText.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void onTextChanged(CharSequence s, int start,
                            int before, int count) {
                    }
                    @Override
                    public void beforeTextChanged(CharSequence s, int start,
                            int count, int after) {
                    }
                    @Override
                    public void afterTextChanged(Editable s) {
                        value = holder.scoreEditText.getText().toString();
                        value = s.toString();
                    }
                });
            return convertView;

      }

        static class ViewHolder{
            public TextView nameTextView;
            public EditText scoreEditText;
        }

    }

请帮忙。非常感谢。

每次更新一行时,都会调用getView()。并且您使用 value = "0" 将文本设置回 0,因此不会应用 afterTextChanged 中字符串值的更新。修复了将字符串文本调用为全局的声明,例如:String value = "0"适配器类中,并从getView()方法中删除value = "0"

除此之外,

  • 删除value = s.toString();
  • value = holder.scoreEditText.getText().toString();移至onTextChanged(..)
  • 将以下内容添加到适配器类:

    public int getViewTypeCount() { return getCount(); }

    public int getItemViewType(int position) { return position; }

不建议将 EditText 放在 listView 中,因为它会导致 listView 本身发生变化(因为键盘)。

相反,您应该使用简单的 TextView,如果您希望在其中编辑某些内容,请使用带有它的对话框或允许您编辑值的新活动。

无论如何,如果您仍然希望在 listView 中使用 EditText,您应该在每次更改其文本时保存它保存的数据(请注意,对于"afterTextChanged",您没有将数据保存到"values"变量中),并在 getView 上恢复它。

您还应该考虑使用"onTextChanged"而不是"afterTextChanged"

最新更新