2014-02-03 2 views
3

Как создать дату Spinner, который показывает текущую дату в EditText по умолчанию и будущие даты в Spinner (например, на ближайшие 30 дней)Как создать Spinner, чтобы показать текущий и следующий 30 даты

я использовал дату во многих приложениях, поэтому я знаком с диалоговым окном выбора даты, но не имею ни малейшего представления о счетчике даты.

Примечание
Пожалуйста, не говорите мне, как стиль EditText, как Spinner

Редакцией: 1 AS РЕКОМЕНДУЕТСЯ @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));   

} 

Редакцией: 2 КАК РЕКОМЕНДУЕТСЯ @erakitin в новой валюте

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) { 

      } 
     }); 

Теперь, пытаясь получить значение выбранного элемента в String, но получая: java.util.GregorianCalendar, где я делаю ошибку?

strDate = spinnerDate.getSelectedItem().toString(); 
+0

Вы можете обратиться последний ответ от этой должности [Android блесны с выбором даты] [1] [1]: http://stackoverflow.com/questions/ 9406920/android-spinner-with-date-picker-like-google-calendar-app – AndyN

ответ

5

Ниже приведен простой пример адаптера для Spinner.

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); 
    } 
} 

Как использовать его для отображения текущей даты и ближайшие 29 дней:

mDateSpinner.setAdapter(new CalendarSpinnerAdapter(getActivity(), 30)); 

UPD:

Мы должны добавить параметр в конструктор адаптера для установки даты начала:

public CalendarSpinnerAdapter(Context context, Calendar startDate, int dayCount) { 
    mInflater = LayoutInflater.from(context); 
    mDayCount = dayCount; 
    mCalendar = Calendar.getInstance(); 
    mCalendar.setTimeInMillis(startDate.getTimeInMillis()); 
} 

Затем добавить слушателя для spinnerDateIn где мы можем инициализировать второй кок:

@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) { 

     } 
    }); 
} 

Я не пробовал этот код, но он должен работать.

UPD2:

spinnerDate.setSelection(position) возвращает Calendar экземпляра класса. Если вы хотите получить выбранную дату как String, ее следует отформатировать. Попробуйте использовать следующий метод:

private String getSelectedDateAsString(Spinner dateSpinner) { 
    Calendar selectedDate = (Calendar) dateSpinner.getSelectedItem(); 
    return new SimpleDateFormat("d MMM yyyy").format(selectedDate.getTimeInMillis()); 
} 
+0

большое вам спасибо :) Я принял ваш ответ и отметил как полезный тоже, и вознаградит вас за вознаграждение через 5 часов .. это самый простой способ сделать это ... Приветствуйте вас, и еще одно - как я выбрал 6 июля 2015 года в первом spinner, и теперь я хочу показать дату с 7 июля 2015 года (опять же со следующими 30 днями) во втором spinner (только например, регистрация в отеле и регистрация) f unctionality .. Я опубликовал код операции выше, и, пожалуйста, дайте мне знать, где я должен внести изменения - код места в новом разделе EDITED – Sun

+0

@Sun, пожалуйста, см. мой обновленный ответ. – erakitin

+0

У меня нет слов, чтобы выразить свое чувство и твой талант Брата: Короче, ты хозяин, и я с нетерпением жду, чтобы вознаградить тебя, но мне нужно подождать еще 1 час ... – Sun

0

Spinner работает с адаптером. Если вы хотите показать на своем счетчике дату с сегодняшнего дня до конца месяца, вы можете сделать. Давайте создадим класс модели, с можно использовать для подачи адаптера,

public class MyDateInterval { 
    public String mDateString; 
    public Date mDate; 

    public MyDateInterval(String dateString, Date date) { 
     mDateString = dateString; 
     mDate = date; 
    } 

    @Override 
    public String toString() { 
     return mDateString; 
    } 
} 

Теперь мы определим ArrayList<MyDateInterval>, что мы пополним с датой вы хотите, чтобы показать:

ArrayList<MyDateInterval> items = new ArrayList<>(); 

Восстановите дата окончания на формат вашего примера:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMM yyyy"); 
Calendar c = Calendar.getInstance(); 
c.set(Calendar.MONTH, 6); 
c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH)); 
// for the sake of the example 31 Jul 2015 
Date endDate = c.getTime(); 
Log.e(getClass().getSimpleName(), dateFormat.format(endDate)); 

Теперь мы рассчитали интервал от сегодняшнего дня до даты окончания

Calendar todayCalendar = Calendar.getInstance(); 
while(endDate.after(todayCalendar.getTime())) { 
    items.add(new MyDateInterval(dateFormat.format(todayCalendar.getTime()), todayCalendar.getTime()); 
    todayCalendar.add(Calendar.DAY_OF_MONTH, 1); 
} 

Теперь мы все части. Вы должны создать Адаптер для Spinner.

ArrayAdapter<MyDateInterval> dataAdapter = new ArrayAdapter<>(this, 
          android.R.layout.simple_spinner_item, items); 
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
spinner.setAdapter(dataAdapter); 

и все должно быть всем.