0

DialogFragmentを拡張するクラスで以下のコードを使用しています。ボタンを追加する前に、カーソルを特定の位置に移動します(setDataFromCursor()を参照)。奇妙なことに、ポジティブボタンのOnClickListenerで位置を再度取得しようとすると、位置が変更されます。それを証明するログ出力を追加しました。なぜそれが起こるのか誰かが知っていますか?

ご協力いただきありがとうございます!

編集:デバッガーでは、それも表示されます。数ステップ進むと、moveToPositionを呼び出さずにカーソル位置が変わります。

@Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Log.v(TAG, "onCreateDialog");
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();
        view = inflater.inflate(R.layout.query_tab_dialog_add_operation,
                null);
        name = (TextView) view.findViewById(R.id.editTextOPName);
        cimclass = (TextView) view.findViewById(R.id.editTextCIMclass);
        setDataFromCursor();
        builder.setView(view)
                .setTitle(
                        R.string.querytabfragment_dialog_editOperation_title)
                .setPositiveButton(R.string.apply,
                        new DialogInterface.OnClickListener() {

                            public void onClick(DialogInterface dialog,
                                    int which) {
                                nameStr = name.getText().toString();
                                cimclassStr = cimclass.getText().toString();

                                Log.d(TAG,
                                        "cursor position: "
                                                + cursor.getPosition());
                                int id = cursor.getInt(0);
                                Log.d(TAG, "cursor on item: " + id);
                                // update affected row
                                queryDBHelper.editCIMQuery(id, nameStr,
                                        cimclassStr);
                                Log.d(TAG, "query edited. id: " + id
                                        + " name: " + nameStr
                                        + " cimclass: " + cimclassStr);
                                cursor.requery();
                            }
                        })
                .setNegativeButton(R.string.cancel,
                        new DialogInterface.OnClickListener() {

                            public void onClick(DialogInterface dialog,
                                    int which) {
                                EditOperationDialogFragment.this
                                        .getDialog().cancel();

                            }
                        });
        return builder.create();
    }

    private void setDataFromCursor() {
        cursor.moveToPosition(cursorPosition);
        name.setText(cursor.getString(1));
        cimclass.setText(cursor.getString(2));          
    }
4

1 に答える 1

0

投稿したコードは、カーソルの位置を他の場所に変更しません。

ただし、cursorListViewにバインドされたCursorAdapterで使用されているのと同じカーソルを参照している場合、ダイアログが描画されると、ListViewの一部が不明瞭になり、ListViewが再描画される可能性があります。これは間違いなく位置を変えます。

解決策: OnClickListenerで再度使用するかmoveToPosition()、独立したカーソルをフェッチします。

于 2012-12-27T18:05:16.477 に答える