0

ListActivityを使用するシンプルなものがありSimpleCursorAdapterます。ユーザーがを使用して値の1つを変更できるようにしますEditText。入力した数値が100未満であることを確認するために、簡単な検証を実行します。ユーザーが入力した値が検証に失敗した場合は、古い値を元に戻したいと思います。

私はいくつかの異なる方法を試しました。私の現在のアプローチは、データベースから再クエリすることですが、これは機能していません。ListActivity実際に変更されたエントリに関係なく、の最後のエントリに関連付けられた値を常に取得しています。LogCat私はそれに気づき、変更された行だけでなく、の各行に対して複数回発砲してonTextChangedいます。afterTextChangedListActivity

コードは次のとおりです。

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(何でも表示、boolean hasFocus) {
                      if (hasFocus) {
                         //コード
                      } そうしないと {
                         //コードまたは空かもしれません
                      }
             }
}

次に、数値が > 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 に答える