开发者

Anything wrong with my code?

开发者 https://www.devze.com 2023-01-10 02:28 出处:网络
package one.two; import android.app.Activity; import android.database.Cursor; import android.os.Bundle; import android.view.View;
package one.two;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.AdapterView.OnItemSelectedListener;


public class Booking extends Activity
{
    private DBAdapter db; 
    private Spinner colourSpinner;
    public Cursor c;
    public TextView txtArrival;
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        db = new DBAdapter(this);
        this.setContentView(R.layout.booking);
        db.open();
        fillData();
        db.close();

        Spinner colourSpinner = (Spinner) findViewById(R.id.myspinner);
    }

    private void fillData()
    {
        Cursor c = db.getSpinnerData();
        startManagingCursor(c);
        String[] from = new String[]{DBAdapter.KEY_ARRIVAL};
        int[] to = new int[]{android.R.id.text1};
        SimpleCursorAdapter adapter =
        new SimpleCursorAdapter(this,R.layout.booking, c, from, to );
        adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );
        Spinner colourSpinner = (Spinner) findViewById(R.id.myspinner);
        colourSpinner.setAdapter(adapter);
    }
    public class MyOnItemSelectedListener implements OnItemSelectedListener
    {
  开发者_Go百科      public void onItemSelected(AdapterView<?> arg0, View v,int position, long id)
        {
            if (Booking.this.c.moveToPosition(position)) {
                String title=Booking.this.c.getString(1);
                Booking.this.txtArrival.setText(title);
            }

        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0)
        {
            // TODO Auto-generated method stub

        }
    };
}

Error log

 08-06 01:27:34.874: ERROR/AndroidRuntime(721): Uncaught handler: thread main exiting due to uncaught exception
08-06 01:27:34.893: ERROR/AndroidRuntime(721): java.lang.NullPointerException
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at one.two.Booking$MyOnItemSelectedListener.onItemSelected(Booking.java:53)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at android.widget.AdapterView.fireOnSelected(AdapterView.java:856)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at android.widget.AdapterView.access$200(AdapterView.java:41)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:827)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at android.os.Handler.handleCallback(Handler.java:587)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at android.os.Looper.loop(Looper.java:123)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at android.app.ActivityThread.main(ActivityThread.java:3948)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at java.lang.reflect.Method.invokeNative(Native Method)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at java.lang.reflect.Method.invoke(Method.java:521)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
08-06 01:27:34.893: ERROR/AndroidRuntime(721):     at dalvik.system.NativeStart.main(Native Method)

Thank you.


In the method fillData() you are creating a local Cursor object "Cursor c", which hides your class member "public Cursor c". You are initializing the local variable and when onItemSelected is called Booking.this.c will be null which gives you the NullPointerException.

Removing the "Cursor" part in fillData() should avoid this.

private void fillData()
{
   c = db.getSpinnerData();
   ...
}


Try calling setOnItemSelectedListener for your spinner with an instance of your custom class.. right now the code inside MyOnItemSelectedListener is not being invoked.

You can modify your onCreate to something like below.

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    db = new DBAdapter(this);
    this.setContentView(R.layout.booking);
    db.open();
    fillData();
    db.close();

    Spinner colourSpinner = (Spinner) findViewById(R.id.myspinner);
    //Set the OnItemSelectedListener for the Spinner
    colourSpinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
}


If Booking.this.c.moveToPosition(position) returns false, you won't set any text. Are you certain it returns true?

You can check this by changing:

if (Booking.this.c.moveToPosition(position)) {
    String title=Booking.this.c.getString(1);
    Booking.this.txtArrival.setText(title);
}

to:

boolean result = Booking.this.c.moveToPosition(position);
if (result) {
    String title=Booking.this.c.getString(1);
    Booking.this.txtArrival.setText(title);
}

and use a debugger or a dialog box or something to display the value of result before you test it.

0

精彩评论

暂无评论...
验证码 换一张
取 消