2012-12-27 33 views
0

我在擴展DialogFragment的類中使用下面的代碼。 在添加按鈕之前,我將光標移動到某個位置(請參閱setDataFromCursor())。奇怪的是,嘗試再次在正按鈕的OnClickListener中獲取位置時位置已更改。 我添加了一些證明這一點的日誌輸出。有人知道爲什麼會發生這種情況嗎?DialogFragment 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));   
    } 

回答

0

您發佈的代碼不會更改其他任何地方的光標位置。

但是,如果綁定到那麼當對話框繪製它一個ListView一個CursorAdapter使用cursor引用相同的遊標可能掩蓋一個ListView迫使ListView控件重繪的一部分。這絕對改變了立場。

解決方案:在OnClickListener中再次使用moveToPosition()或獲取獨立的光標。

+0

你說得對。遊標通過適配器綁定到gridView。所以我會再次使用moveToPosition()。謝謝。 – AndyB

+0

或者,也許有更好的方法來操縱上下文菜單下的項目,而不是將光標移動到項目在列表/ gridview中的位置? – AndyB

+0

看起來你只需要id列,你可以在'setDataFromCursor()'裏面保存'cursor.getInt(0)'作爲一個字段變量,那麼不用擔心Cursor的位置。 – Sam