2

私はこれでぐるぐる回り続けます。データベース内のレコードと一致する場合にリストに項目を表示するようにスピナーを設定できましたが、レコードを保存するときにスピナーから選択した項目を取得する際に問題が発生しました。代わりに、「android.database.sqlite.SQLiteCursor@44fa41b0」のようなものを取得します。

私の saveInspection() メソッドでは、 inspectedBySpinner.getSelectedItem().toString(); を使用しています。(この投稿の2番目の回答で詳しく説明されているように、スピナーの選択された値を取得するにはどうすればよいですか?)成功しませんでした..(非常に近いのにバナナはありません!)。

これは明らかなことだと確信していますが、非常に感謝しています:

public class InspectionEdit extends Activity {

final Context context = this;

private EditText inspectionReferenceEditText;
private EditText inspectionCompanyEditText;
private Button inspectionDateButton;
private Spinner inspectedBySpinner;
private Button saveButton;
private Button cancelButton;
protected boolean changesMade;
private AlertDialog unsavedChangesDialog;
private Button addInspectorButton;

private int mYear;
private int mMonth;
private int mDay;
private StringBuilder mToday;
private RMDbAdapter rmDbHelper;
private long inspectionId;

private String inspectedBySpinnerData;

//private String inspectors;

static final int DATE_DIALOG_ID = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    rmDbHelper = new RMDbAdapter(this);
    rmDbHelper.open();
    Intent i = getIntent();
    inspectionId = i.getLongExtra("Intent_InspectionID", -1);
    setContentView(R.layout.edit_inspection);
    setUpViews();
    populateFields();
    fillSpinner();
    setTextChangedListeners();

}

private void setUpViews() {
    inspectionReferenceEditText =(EditText)findViewById(R.id.inspection_reference);
    inspectionCompanyEditText =(EditText)findViewById(R.id.inspection_company);
    inspectionDateButton =(Button)findViewById(R.id.inspection_date);
    inspectedBySpinner =(Spinner)findViewById(R.id.inspected_by_spinner);

    addInspectorButton = (Button)findViewById(R.id.add_inspector_button);
    saveButton = (Button)findViewById(R.id.inspection_save_button);
    cancelButton = (Button)findViewById(R.id.inspection_cancel_button);
}

 private void populateFields() {
        if (inspectionId > 0) {
            Cursor inspectionCursor = rmDbHelper.fetchInspection(inspectionId);
            startManagingCursor(inspectionCursor);
            inspectionReferenceEditText.setText(inspectionCursor.getString(
                    inspectionCursor.getColumnIndexOrThrow(RMDbAdapter.INSPECTION_REF)));
            inspectionCompanyEditText.setText(inspectionCursor.getString(
                    inspectionCursor.getColumnIndexOrThrow(RMDbAdapter.INSPECTION_COMPANY)));
            inspectionDateButton.setText(inspectionCursor.getString(
                    inspectionCursor.getColumnIndexOrThrow(RMDbAdapter.INSPECTION_DATE)));
            inspectedBySpinnerData = inspectionCursor.getString(
                    inspectionCursor.getColumnIndexOrThrow(RMDbAdapter.INSPECTION_BY));

            Toast.makeText(getApplicationContext(), inspectedBySpinnerData, 
                 Toast.LENGTH_LONG).show();
        }
    }

private void fillSpinner() {

    Cursor inspectorCursor = rmDbHelper.fetchAllInspectors();
    startManagingCursor(inspectorCursor);

    // create an array to specify which fields we want to display
    String[] from = new String[]{RMDbAdapter.INSPECTOR_NAME};
    //INSPECTOR_NAME = "inspector_name"
    // create an array of the display item we want to bind our data to
    int[] to = new int[]{android.R.id.text1};
    // create simple cursor adapter
    SimpleCursorAdapter spinnerAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, inspectorCursor, from, to );
    spinnerAdapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );
    // get reference to our spinner
    inspectedBySpinner.setAdapter(spinnerAdapter);
    if (inspectionId > 0) {

        int spinnerPosition = 0; 

        for (int i = 0; i < inspectedBySpinner.getCount(); i++)  
        { 
             Cursor cur = (Cursor)(inspectedBySpinner.getItemAtPosition(i)); 

             //--When your bind you data to the spinner to begin with, whatever columns you 
             //--used you will need to reference it in the cursors getString() method... 

             //--Since "getString()" returns the value of the requested column as a String--  
             //--(In my case) the 4th column of my spinner contained all of my text values  
             //--hence why I set the index of "getString()" method to "getString(3)" 

             String currentSpinnerString = cur.getString(1).toString(); 

             if(currentSpinnerString.equals(inspectedBySpinnerData.toString())) 
             { 
                //--get the spinner position-- 
                spinnerPosition = i; 
                break; 
              } 
         }       
         inspectedBySpinner.setSelection(spinnerPosition); 
    }

}


 private void addInspector() {
    // get prompts.xml view
    LayoutInflater li = LayoutInflater.from(context);
    View promptsView = li.inflate(R.layout.prompt_dialog, null);

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
            context);

    // set prompts.xml to alertdialog builder
    alertDialogBuilder.setView(promptsView);

    final EditText userInput = (EditText) promptsView
            .findViewById(R.id.editTextDialogUserInput);

    // set dialog message
    alertDialogBuilder
        .setCancelable(false)
        .setPositiveButton("OK",
          new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int id) {
            // get user input and set it to result
            // edit text
            String inspector = userInput.getText().toString();
            rmDbHelper.createInspector(inspector);

            }
          })
        .setNegativeButton("Cancel",
          new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int id) {
            dialog.cancel();
            }
          });

    // create alert dialog
    AlertDialog alertDialog = alertDialogBuilder.create();

    // show it
    alertDialog.show();
 }

private void setTextChangedListeners() {
     changesMade = false;

     inspectionReferenceEditText.addTextChangedListener(new TextWatcher(){
         public void afterTextChanged(Editable s) {
         }
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         }
         public void onTextChanged(CharSequence s, int start, int before, int count) {
             changesMade = true;
         }  
    });

     inspectionCompanyEditText.addTextChangedListener(new TextWatcher(){
        public void afterTextChanged(Editable s) {
        }
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            changesMade = true;
        }   
    }); 

     inspectionDateButton.addTextChangedListener(new TextWatcher(){
        public void afterTextChanged(Editable s) {
        }
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            changesMade = true;
        }   
    });

    inspectionDateButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            showDialog(DATE_DIALOG_ID);
        }
    });

    addInspectorButton.setOnClickListener(new View.OnClickListener() {                      
        public void onClick(View v) {
            addInspector();
        }
    });

    saveButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            saveInspection();
            finish();
        }
    });

    cancelButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
        cancel();
        }
    });
  }

protected void saveInspection() {
    String reference = inspectionReferenceEditText.getText().toString();
    String companyName = inspectionCompanyEditText.getText().toString();
    String inspectionDate = RMUtilities.compareTwoStringsNullIfSame(inspectionDateButton.getText().toString(), "Click to add");
    String inspectedBy = inspectedBySpinner.getSelectedItem().toString();
    Toast.makeText(getApplicationContext(), inspectedBy, 
            Toast.LENGTH_LONG).show();
    if (inspectionId > 0) {
        rmDbHelper.updateInspection(inspectionId, reference, companyName, inspectionDate, inspectedBy);
        Toast.makeText(getApplicationContext(), "Inspection updated", 
                Toast.LENGTH_LONG).show();
    }
    else {
        rmDbHelper.createInspection(reference, companyName, inspectionDate, inspectedBy);
        Toast.makeText(getApplicationContext(), "Inspection created", 
                Toast.LENGTH_LONG).show();
    }

}
4

1 に答える 1

6

CursorAdapter文字列のリストまたは配列に基づくアダプタではなく、を使用するため、選択したアイテムの値をフェッチするにはカーソルを使用する必要がありますスピナーgetSelectedItemはCursorAdapterを呼び出し、オブジェクトgetItem(position)を返しCursorます。したがって、を使用する代わりにtoString()、最初に返されたオブジェクトをにキャストしてから、Cursorカーソルのget...メソッドを使用して、選択したアイテムの必要なデータをフェッチします。

編集

スピナーの充填方法に基づいて、おそらくこれが必要になります。

String inspectedBy = ((Cursor)inspectedBySpinner.getSelectedItem())
                        .getString(1).toString();
于 2012-09-03T18:33:59.257 に答える