brux
brux

Reputation: 3230

Android spinner "onclicklistener" question

I am working with Spinner, cursors and adapters.

I want to setup a click listener for the spinner so that once a user selects an item from the spinner it gets the current selected item and then carrys out some other tasks ( all this extra code is fine, its just 1 problem I am having).... It kind of works, however, once I declare the setOnItemSelectedListener callback, since the cursor has already been populated, the event is fired as soon as the app launches.

I guess I need a way to define the cursor without selecting an initial item so that the event doesnt fire (since an item will not be selected). Or is there another better way to achieve this?

Basically, as it stands, once the app loads the setOnItemSelectedListener function is firing because the cursor is being populated ( i think). Moreover, ignoreing the fact that the event is firing too soon, if I then select the -same- item in the spinner, it doesnt fire the event sincethe item didnt change. SHould I be using a different callback instead of setonitemslectedlistener? Here is the code I have so far.

            c = db.getallrecents();
    startManagingCursor(c);

    busnumspinner = (Spinner) findViewById(R.id.Spinner01);

        SimpleCursorAdapter spinneradapter = new SimpleCursorAdapter(this,
                R.layout.lvlayout, c, spincol, spinto);

    busnumspinner.setAdapter(spinneradapter);


    busnumspinner.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            String spinnerString = null;
            Cursor cc = (Cursor)(busnumspinner.getSelectedItem());
            if (cc != null) {
                spinnerString = cc.getString(
                    cc.getColumnIndex("busnum"));
                text = spinnerString;
            }

            showDialog(DATE_DIALOG_ID);

        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView) {
            // your code here
        }
    });

Upvotes: 0

Views: 10330

Answers (4)

OferR
OferR

Reputation: 1644

Try this:

Extend your SimpleCursorAdapter, override bindView() and set OnClickListener for the row view.

This will overcome both issues: You do not get the initial call, and you get each selection click (inc. re-selection)

Let me know if you need example code.

EDIT: Code example:

protected class NoteAdapter extends SimpleCursorAdapter {

    // Constructor
    public NoteAdapter(Context context, Cursor c) {
        super(context, R.layout.etb_items_strip_list_item, c, fromNote, toNote);
    }


    // This is where the actual binding of a cursor to view happens
    @Override
    public void bindView(View row, Context context, Cursor cursor) {
        super.bindView(row, context, cursor);

        // Save id
        Long id = cursor.getLong(cursor.getColumnIndex("_id"));
        row.setTag(id);

        // Set callback
        row.setOnClickListener(row_OnClick);
    }

    // Callback: Item Click
    OnClickListener row_OnClick = new OnClickListener(){
        public void onClick(View v) {
            Long id = (Long) v.getTag();
        }
    };

}

Upvotes: 0

Manjeet
Manjeet

Reputation: 25

you can add first item of spinner by default value like selectvalues and check its position in onitemselected listener, if it's zero position then dont enter in the loop greater than 0 then enter in the method

see the example

 busnumspinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int   
    position, long id) {
     if(position!=0)
     {
        String spinnerString = null;
        Cursor cc = (Cursor)(busnumspinner.getSelectedItem());
        if (cc != null) {
            spinnerString = cc.getString(
                cc.getColumnIndex("busnum"));
            text = spinnerString;
        }
      }

    So this is not run the default value

Upvotes: 1

Javi
Javi

Reputation: 19779

This has already been discussed in this question. Look there, though it has a similar answer like the one given by blindstuff.

EDIT:

If the onItemSelectedListener is not firing when you need it, then you probably need a onClickListener in eachtext item of the droplist and get in there the current position of the selected item of the spinner. The problem is that as it is said here spinner don't support this event, but maybe you can get it by doing something similar to the explained in this stackoverflow question. I haven't tried it so I'm not sure it will work.

Upvotes: 3

blindstuff
blindstuff

Reputation: 18348

Use a boolean flag to ignore the first time it gets selected by the system, its not a pretty solution, but i've struggled with this a couple of times, and never found a better solution.

Upvotes: 2

Related Questions