0

我有一个简单ListActivity的使用SimpleCursorAdapter. 我允许用户使用EditText. 我执行简单验证以确保输入的数字小于 100。如果用户输入的值验证失败,我想将旧值放回原处。

我尝试了几种不同的方法。我目前的方法是从数据库中重新查询它,但这不起作用。我总是得到与 中最后一个条目相关联的值ListActivity,而不管实际更改了哪一个。我注意到了LogCat这一点,onTextChanged并且afterTextChanged为每一行触发了多次,ListActivity而不仅仅是改变的那一行。

这是代码:

public class MySimpleCursorAdapter extends SimpleCursorAdapter {

    Context lcontext;
    boolean changed;
    String lastval;

    private PortfolioData pfdata;

    public MySimpleCursorAdapter(Context context, int layout, Cursor c,
        String[] from, int[] to) {
        super(context, layout, c, from, to);

        lcontext = context;
    }

    @Override
    public View getView(final int pos, View v, ViewGroup parent) {

        v = super.getView(pos, v, parent);
        final EditText et = (EditText) v.findViewById(R.id.classpercentage);

        final TextView tv = (TextView) v.findViewById(R.id._id);
        et.addTextChangedListener(new TextWatcher() {
            public void afterTextChanged(Editable s) {
                Log.d("TEST", "In afterTextChanged s=" + s.toString() + " "
                    + tv.getText() + " POS = " + Integer.toString(pos));

                lastval = tv.getText().toString();


                if (changed == true) {
                    String enteredValue = s.toString();
                    if (checkNullValues(enteredValue)) {
                        if (Float.parseFloat(enteredValue.trim()) > 100.0f) {


                            AlertDialog.Builder builder = new AlertDialog.Builder(
                                lcontext);

                            builder.setMessage("Percentage Value should be Less than 100");

                            builder.setPositiveButton("Ok",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(
                                        DialogInterface arg0, int arg1) {

                                        String sql = "select c.percentage as PERCENTAGE " + 
                                        "from asset_classes c WHERE c._id = " + lastval + ";";

                                        pfdata = new PortfolioData(lcontext);
                                        SQLiteDatabase db = pfdata.getReadableDatabase();

                                        Cursor cursor = db.rawQuery(sql, null);

                                        if (cursor != null)
                                        {
                                            cursor.moveToFirst();

                                            et.setText(cursor.getString(0));
                                        }

                                        cursor.close();
                                        pfdata.close();
                                    }
                                });
                            // End of the Alert

                            if (changed == true)
                            {
                                builder.show();
                            }
                        }
                    }
                    changed = false;
                }


            }

            public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
                // Log.d("TEST", "In beforeTextChanged start=" +
                // Integer.toString(start) +" count="+ Integer.toString(count) +
                // " after=" + Integer.toString(after) + " s=" + s + " " + tv);
            }

            public void onTextChanged(CharSequence s, int start, int before,
                int count) {
                Log.d("TEST", "In onTextChanged start=" +
                    Integer.toString(start) + " count=" + Integer.toString(count)
                    + " before=" + Integer.toString(before) + " s=" + s + " " +
                    tv);
                changed = true;

            }
        });

        return v;
    }
}

我真的很感激对此有新的看法。与往常一样,提前致谢。

4

2 回答 2

0

尝试使用 onFocusChangeListener。当它获得焦点时,将当前文本保存到类的字段中。

就像是:

String oldText - 将是您的旧文本字段。

然后你做:

et.setOnFocusChangeListener(新 OnFocusChangeListener()) {
             @覆盖
             public void onFocusChange(查看任何内容,布尔值 h​​asFocus){
                      如果(有焦点){
                         //代码
                      } 别的 {
                         //代码或可能为空
                      }
             }
}

然后,如果数字 > 100,您只需获取 oldText 值并放入 EditText。

于 2012-07-05T17:25:30.460 回答
0

我认为您不知道 ListView 中的回收。在 Cursor 中有 1000 行,只创建了 10-20(取决于屏幕大小)行视图。
不要在视图中存储数据!

一开始我建议您阅读http://commonsware.com/Android/excerpt.pdf

于 2012-07-05T17:34:40.467 回答