How to create a Spinner to display the current and next 30 dates
How to create a date spinner that displays the current date as the default date in EditText and the future date in the spinner (for example, the next 30 days).
I’ve used date pickers in a lot of apps, so I’m familiar with date picker dialogs, but don’t know anything about date spinner anymore.
Attention
Please don’t tell me how to set EditText to Spinner
EDITED: 1 Recommended by @erakitin
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_date);
Spinner spinnerDateIn = (Spinner) findViewById(R.id.spinnerDateIn);
Spinner spinnerDateOut = (Spinner) findViewById(R.id.spinnerDateOut);
spinnerDateIn.setAdapter(new CalendarSpinnerAdapter(SpinnerDateActivity.this, 30));
}
EDITED: 2 Recommended by @erakitin
in the new update
CalendarSpinnerAdapter mSpinnerDateInAdapter = new CalendarSpinnerAdapter(SpinnerDateActivity.this, 30);
spinnerDate.setAdapter(mSpinnerDateInAdapter);
spinnerDate.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
spinnerDate.setSelection(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
Now, trying to get the value of the selected item in the string but get: java.util.GregorianCalendar
, where did I do it wrong?
strDate = spinnerDate.getSelectedItem().toString();
Solution
The following is a simple example of a Spinner
adapter.
public class CalendarSpinnerAdapter extends BaseAdapter {
private SimpleDateFormat mDateFormat = new SimpleDateFormat("d MMM yyyy");
private LayoutInflater mInflater;
private Calendar mCalendar;
private int mDayCount;
private int mLastRequestedDay = 0;
public CalendarSpinnerAdapter(Context context, int dayCount) {
mInflater = LayoutInflater.from(context);
mDayCount = dayCount;
mCalendar = Calendar.getInstance();
}
@Override
public int getCount() {
return mDayCount;
}
@Override
public Calendar getItem(int position) {
mCalendar.add(Calendar.DAY_OF_YEAR, position - mLastRequestedDay);
mLastRequestedDay = position;
return mCalendar;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(android. R.layout.simple_spinner_dropdown_item, parent, false);
}
Calendar item = getItem(position);
((TextView) convertView).setText(mDateFormat.format(item.getTimeInMillis()));
return convertView;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getView(position, convertView, parent);
}
}
How to use it to display the current date and the next 29 days:
mDateSpinner.setAdapter(new CalendarSpinnerAdapter(getActivity(), 30));
Update:
We should add a parameter to the adapter’s constructor to set the start date:
public CalendarSpinnerAdapter(Context context, Calendar startDate, int dayCount) {
mInflater = LayoutInflater.from(context);
mDayCount = dayCount;
mCalendar = Calendar.getInstance();
mCalendar.setTimeInMillis(startDate.getTimeInMillis());
}
Then add a listener for spinnerDateIn
, where we can initialize a second spinner:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_date);
Spinner spinnerDateIn = (Spinner) findViewById(R.id.spinnerDateIn);
final Spinner spinnerDateOut = (Spinner) findViewById(R.id.spinnerDateOut);
mSpinnerDateInAdapter = new CalendarSpinnerAdapter(SpinnerDateActivity.this, Calendar.getInstance(), 30);
spinnerDateIn.setAdapter(mSpinnerDateInAdapter);
spinnerDateIn.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Calendar dateIn = Calendar.getInstance();
dateIn.setTimeInMillis(mSpinnerDateInAdapter.getItem(position).getTimeInMillis());
dateIn.add(Calendar.DAY_OF_YEAR, 1); add one day
mSpinnerDateOutAdapter = new CalendarSpinnerAdapter(SpinnerDateActivity.this, dateIn, 30);
spinnerDateOut.setAdapter(mSpinnerDateOutAdapter);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
I didn’t try this code, but it should work.
UPD2:
spinnerDate.setSelection(position)
returns an instance of the Calendar
class. If you want to get the selected date as String
, you should format it. Try the following method:
private String getSelectedDateAsString(Spinner dateSpinner) {
Calendar selectedDate = (Calendar) dateSpinner.getSelectedItem();
return new SimpleDateFormat("d MMM yyyy").format(selectedDate.getTimeInMillis());
}