Android : Fill Spinner From Java Code Programmatically

AndroidAndroid LayoutAndroid Spinner

Android Problem Overview


How do you fill a spinner from java code programmatically?

I have a spinner in the layout like this:

 <Spinner
     android:id="@+id/consultation_deseases"
     android:layout_width="@dimen/bigSpinnerWidth"
     android:layout_height="@dimen/bigSpinnerHeight"
     android:prompt="@string/disease_prompt" />

With java code I need to create the adapter and add the items.

Android Solutions


Solution 1 - Android

// you need to have a list of data that you want the spinner to display
List<String> spinnerArray =  new ArrayList<String>();
spinnerArray.add("item1");
spinnerArray.add("item2");
    
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
    this, android.R.layout.simple_spinner_item, spinnerArray);

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
Spinner sItems = (Spinner) findViewById(R.id.spinner1);
sItems.setAdapter(adapter);

also to find out what is selected you could do something like this

String selected = sItems.getSelectedItem().toString();
if (selected.equals("what ever the option was")) {
}

Solution 2 - Android

Here is an example to fully programmatically:

  • init a Spinner.
  • fill it with data via a String List.
  • resize the Spinner and add it to my View.
  • format the Spinner font (font size, colour, padding).
  • clear the Spinner.
  • add new values to the Spinner.
  • redraw the Spinner.

I am using the following class vars:

Spinner varSpinner;
List<String> varSpinnerData;

float varScaleX;
float varScaleY;	

A - Init and render the Spinner (varRoot is a pointer to my main Activity):

public void renderSpinner() {
	
	
	List<String> myArraySpinner = new ArrayList<String>();

	myArraySpinner.add("red");
	myArraySpinner.add("green");
	myArraySpinner.add("blue");		

	varSpinnerData = myArraySpinner;

	Spinner mySpinner = new Spinner(varRoot);				
	
	varSpinner = mySpinner;
	
	ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(varRoot, android.R.layout.simple_spinner_item, myArraySpinner);
	spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // The drop down vieww
	mySpinner.setAdapter(spinnerArrayAdapter);

B - Resize and Add the Spinner to my View:

	FrameLayout.LayoutParams myParamsLayout = new FrameLayout.LayoutParams(
			FrameLayout.LayoutParams.MATCH_PARENT, 
			FrameLayout.LayoutParams.WRAP_CONTENT);
	myParamsLayout.gravity = Gravity.NO_GRAVITY;			 

	myParamsLayout.leftMargin = (int) (100 * varScaleX);
	myParamsLayout.topMargin = (int) (350 * varScaleY);				
	myParamsLayout.width = (int) (300 * varScaleX);;
	myParamsLayout.height = (int) (60 * varScaleY);;

	
	varLayoutECommerce_Dialogue.addView(mySpinner, myParamsLayout);
	

C - Make the Click handler and use this to set the font.

	mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
		
	    @Override
	    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int myPosition, long myID) {
	    	
	    	Log.i("renderSpinner -> ", "onItemSelected: " + myPosition + "/" + myID);
	    	
	        ((TextView) parentView.getChildAt(0)).setTextColor(Color.GREEN);
	        ((TextView) parentView.getChildAt(0)).setTextSize(TypedValue.COMPLEX_UNIT_PX, (int) (varScaleY * 22.0f) );
	        ((TextView) parentView.getChildAt(0)).setPadding(1,1,1,1);
	    	
	    	
	    }

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

	});
	
}	

D - Update the Spinner with new data:

private void updateInitSpinners(){
	
	 String mySelected = varSpinner.getSelectedItem().toString();
	 Log.i("TPRenderECommerce_Dialogue -> ", "updateInitSpinners -> mySelected: " + mySelected);
	 
	 
	 varSpinnerData.clear();
	 
	 varSpinnerData.add("Hello World");
	 varSpinnerData.add("Hello World 2");
	 		
	 ((BaseAdapter) varSpinner.getAdapter()).notifyDataSetChanged();
	 varSpinner.invalidate();
	 varSpinner.setSelection(1);
	 
}

}

What I have not been able to solve in the updateInitSpinners, is to do varSpinner.setSelection(0); and have the custom font settings activated automatically.

UPDATE:

This "ugly" solution solves the varSpinner.setSelection(0); issue, but I am not very happy with it:

private void updateInitSpinners(){

	String mySelected = varSpinner.getSelectedItem().toString();
	Log.i("TPRenderECommerce_Dialogue -> ", "updateInitSpinners -> mySelected: " + mySelected);


	varSpinnerData.clear();

	ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(varRoot, android.R.layout.simple_spinner_item, varSpinnerData);
	spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
	varSpinner.setAdapter(spinnerArrayAdapter);	 


	varSpinnerData.add("Hello World");
	varSpinnerData.add("Hello World 2");

	((BaseAdapter) varSpinner.getAdapter()).notifyDataSetChanged();
	varSpinner.invalidate();
	varSpinner.setSelection(0);

}

}

Hope this helps......

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRana OsamaView Question on Stackoverflow
Solution 1 - AndroidWIllJBDView Answer on Stackoverflow
Solution 2 - AndroidAl-Noor LadhaniView Answer on Stackoverflow