如何创建微调,显示当前及未来30日期 [英] How to create Spinner to show current and next 30 dates

查看:392
本文介绍了如何创建微调,显示当前及未来30日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我怎样才能创建一个日期微调,这说明在当前的EditText日期为微调默认和将来的日期(如,未来30天)

我用日期选取器在许多应用程序,所以我很熟悉日期选取器对话,但没有关于日期的微调任何想法。

注意结果
请不要告诉我如何风格的EditText为微调

编辑:1 所推荐的 @erakitin

  @覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_date);    微调spinnerDateIn =(微调)findViewById(R.id.spinnerDateIn);
    微调spinnerDateOut =(微调)findViewById(R.id.spinnerDateOut);    spinnerDateIn.setAdapter(新CalendarSpinnerAdapter(SpinnerDateActivity.this,30));}

编辑:2 所推荐的 @erakitin 在新的更新

  CalendarSpinnerAdapter mSpinnerDateInAdapter =新CalendarSpinnerAdapter(SpinnerDateActivity.this,30);
        spinnerDate.setAdapter(mSpinnerDateInAdapter);        spinnerDate.setOnItemSelectedListener(新AdapterView.OnItemSelectedListener(){
            @覆盖
            公共无效onItemSelected(适配器视图<>母公司,观景,INT位置,长的id){
                spinnerDate.setSelection(位置);
            }            @覆盖
            公共无效onNothingSelected(适配器视图<>母公司){            }
        });

现在,试图让字符串选定项的值,但得到:<?code>的java.util.GregorianCalendar ,其中我在做什么错误

  strDate = spinnerDate.getSelectedItem()的toString();


解决方案

有转接头供微调下面一个简单的例子。

 公共类CalendarSpinnerAdapter延伸BaseAdapter {    私人SimpleDateFormat的mDateFormat =新的SimpleDateFormat(D MMM YYYY);    私人LayoutInflater mInflater;
    私人日历mCalendar;
    私人诠释mDayCount;
    私人INT mLastRequestedDay = 0;    公共CalendarSpinnerAdapter(上下文的背景下,诠释DAYCOUNT){
        mInflater = LayoutInflater.from(上下文);
        mDayCount = DAYCOUNT;
        mCalendar = Calendar.getInstance();
    }    @覆盖
    公众诠释的getCount(){
        返回mDayCount;
    }    @覆盖
    公共日历的getItem(INT位置){
        mCalendar.add(Calendar.DAY_OF_YEAR,位置 - mLastRequestedDay);
        mLastRequestedDay =位置;
        返回mCalendar;
    }    @覆盖
    众长getItemId(INT位置){
        返回的位置;
    }    @覆盖
    公共查看getView(INT位置,查看convertView,父母的ViewGroup){
        如果(convertView == NULL){
            convertView = mInflater.inflate(android.R.layout.simple_spinner_dropdown_item,父母,假);
        }        日历项目=的getItem(位置);
        ((的TextView)convertView).setText(mDateFormat.format(item.getTimeInMillis()));        返回convertView;
    }    @覆盖
    公共查看getDropDownView(INT位置,查看convertView,父母的ViewGroup){
        返回getView(位置,convertView,父母);
    }
}

如何用它来显示当前的日期和下次29天:

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

UPD:

我们应该在参数添加到适配器的构造函数来设置起始日期:

 公共CalendarSpinnerAdapter(上下文的背景下,日历的startDate,诠释DAYCOUNT){
    mInflater = LayoutInflater.from(上下文);
    mDayCount = DAYCOUNT;
    mCalendar = Calendar.getInstance();
    mCalendar.setTimeInMillis(startDate.getTimeInMillis());
}

那么关于 spinnerDateIn 添加监听器,我们可以初始化第二微调:

  @覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_date);    微调spinnerDateIn =(微调)findViewById(R.id.spinnerDateIn);
    最后的微调spinnerDateOut =(微调)findViewById(R.id.spinnerDateOut);    mSpinnerDateInAdapter =新CalendarSpinnerAdapter(SpinnerDateActivity.this,Calendar.getInstance(),30);
    spinnerDateIn.setAdapter(mSpinnerDateInAdapter);    spinnerDateIn.setOnItemSelectedListener(新AdapterView.OnItemSelectedListener(){
        @覆盖
        公共无效onItemSelected(适配器视图&LT;&GT;母公司,观景,INT位置,长的id){
            日历dateIn = Calendar.getInstance();
            dateIn.setTimeInMillis(mSpinnerDateInAdapter.getItem(位置).getTimeInMillis());
            dateIn.add(Calendar.DAY_OF_YEAR,1); //添加1天
            mSpinnerDateOutAdapter =新CalendarSpinnerAdapter(SpinnerDateActivity.this,dateIn,30);
            spinnerDateOut.setAdapter(mSpinnerDateOutAdapter);
        }        @覆盖
        公共无效onNothingSelected(适配器视图&LT;&GT;母公司){        }
    });
}

我没有尝试这个code,但它应该工作。

UPD2:

spinnerDate.setSelection(位置)收益日历类的实例。如果你想获得选定的日期为字符串你应该格式化。尝试使用下面的方法:

 私人字符串getSelectedDateAsString(微调dateSpinner){
    日历selectedDate =(日历)dateSpinner.getSelectedItem();
    返回新的SimpleDateFormat(D MMM YYYY)格式(selectedDate.getTimeInMillis())。
}

How can I create a date Spinner, which shows current date in EditText as default and future dates in Spinner (like, for next 30 days)

I used date picker in many apps, so I am familiar with date picker dialog but don't have any idea about date spinner.

Note
Please don't tell me How to style EditText as Spinner

EDITED: 1 AS 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 AS RECOMMENDED BY @erakitin in 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 value of selected Item in String but getting: java.util.GregorianCalendar, where i am doing mistake ?

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

解决方案

There are a simple example of adapter for Spinner below.

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 for display current date and next 29 days:

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

UPD:

We should add a parameter to adapter's constructor for setting the starting date:

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

Then add listener for spinnerDateIn where we can initialize the 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 Calendar class instance. If you want to get selected date as String you should format it. Try to use following method:

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

这篇关于如何创建微调,显示当前及未来30日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆