EditText会在滚动时丢失它的值

时间:2014-03-02 10:23:07

标签: android android-listview android-edittext

我一直在网上寻找可能的答案。我找到了一个,但它会在滚动时继续改变它的价值。我不知道我的代码的哪一部分会让它发生变化。我的自定义EditText中有TextViewListViewTextView将保留数据库中的学生列表,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;

        }


    }

请帮忙。非常感谢你。

2 个答案:

答案 0 :(得分:4)

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

除此之外,

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

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

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

答案 1 :(得分:0)

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

相反,你应该使用简单的TextView,如果你想在那里编辑某些内容,可以使用带有它的对话框或允许你编辑值的新活动。

在任何情况下,如果您仍希望在listView中使用EditText,则应在每次更改其文本时保存它所保存的数据(请注意,对于“afterTextChanged”,您没有将数据保存到“值”中变量),并在getView上恢复它。

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