AndroidDevM10
AndroidDevM10

Reputation: 141

How to handle selected item event of multiple spinners?

I have created three spinners programatically. I want only one spinner item value should be selected and other spinners will be set default value as "select".

Example: If user selects item from spinner1 then spinner2 and spinner3 will have default value as "Select" and goes on.

For event handling, have written this custom listener:

    OnExItemSelectedListener onItemSelectedListner =  new OnExItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view,int pos, long id) {
            Log.e("selected","test");
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            Log.e("nothing","test");
        }

        @Override
        public void typeSelected(Spinner customSpinner,int type,int position) {

            if (type == 1) {

                if(spinner1 !=null)
                {
                    spinner1 .setSelection(position);
                    spinner2 .setSelection(-1);
                    spinner3 .setSelection(-1);
                }

                if(spinner1Txt!=null)
                spinner1Txt.setText( ""+customSpinner.getItemAtPosition(position));

                if(spinner2Txt!=null)
                spinner2Txt.setText("Select card");
                if(spinner3Txt!=null)
                spinner3Txt.setText("Select card");
            }
            else if (type == 2) {

                if(spinner2 !=null)
                {
                    spinner2 .setSelection(position);
                    spinner1 .setSelection(-1);
                    spinner3 .setSelection(-1);
                }
                    if(spinner2Txt!=null)
                spinner2Txt.setText( ""+customSpinner.getItemAtPosition(position));

                if(spinner1Txt!=null)
                spinner1Txt.setText("Select card");
                if(spinner3Txt!=null)
                spinner3Txt.setText("Select card");

            }
            else if (type == 3) {
                if(spinner3 !=null)
                {
                    spinner3 .setSelection(position);
                    spinner2 .setSelection(-1);
                    spinner1 .setSelection(-1);
                }
                if(spinner3Txt!=null)
                    spinner3Txt.setText("Select card");
                    if(spinner2Txt!=null)
                    spinner2Txt.setText("Select card");
                    if(spinner1Txt!=null)
                    spinner1Txt.setText(""+customSpinner.getItemAtPosition(position));
            }
        }
    };

Problem with above code is: If user have selected item at position 0 for spinner1 then next time user is unable to select item at same position for spinner2 and vice versa.

Upvotes: 1

Views: 1656

Answers (1)

Martin Stanimirov
Martin Stanimirov

Reputation: 534

First I'll show you the final result (API 17):

Photos (I dont have 10 reputation to post image :D)

Now let's create the custom listview (list_view.xml):

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent" 
                android:gravity="center">

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/ListTitle"
              android:layout_width="fill_parent"
              android:textSize="20sp"
              android:layout_height="50dp"
              android:layout_marginLeft="20dp"
              android:textColor="@color/dialog_text"
              android:gravity="center_vertical"
              android:textStyle="bold" />

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/border"
              android:layout_below="@id/ListTitle"
              android:layout_width="fill_parent"
              android:layout_height="3dp" 
              android:background="yourColor" />

    <LinearLayout android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:layout_below="@id/border"
                  android:gravity="center"
                  android:orientation="horizontal" >

        <ListView android:id="@+id/ListView" 
                  android:layout_height="wrap_content"
                  android:layout_width="fill_parent" android:listSelector="color for item hover/click" android:scrollbars="none" />

    </LinearLayout>

</RelativeLayout>

And now the Spinner:

private void Spinner(int array, final EditText field, String setTitle) {

    String[] items = getResources().getStringArray(array);

    LayoutInflater inflater = getLayoutInflater();
    View view = inflater.inflate(R.layout.list_view, null);
    TextView mytitle = (TextView) view.findViewById(R.id.ListTitle);
    mytitle.setText(setTitle);

    ListView listView = (ListView) view.findViewById(R.id.ListView);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);

    listView.setAdapter(adapter);

    final AlertDialog spinner = new AlertDialog.Builder(this)
            .setView(view)
            .create();

    field.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            spinner.show();

        }

    });

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            String item = (String) parent.getItemAtPosition(position); // Selected item

            field.setText(item); // This sets the selected item as value for its EditText

            spinner2.setText("something"); //The value you want to display on spinner2 
            spinner3.setText("something"); //The value you want to display on spinner3 

        }
    });

}

And now how to use it:

Add android:focusableInTouchMode="false" in your EditText for spinner

And call this function in your OnCreate with R.array.yourArray, YourEditText and String to display as Title for any of your Spinners.

Upvotes: 1

Related Questions