android 按日期列表_android 日期列表 - CSDN
  • 经常遇见一个列表,两个接口的情况,两个接口属于两个不同的表数据,那么数据拼接回来之后,并不是按照时间排序的,看起来就相当混乱,所以记录一下如何对数据按照时间排序。步骤一:格式化日期 public static Date ...

    经常遇见一个列表,两个接口的情况,两个接口属于两个不同的表数据,那么数据拼接回来之后,并不是按照时间排序的,看起来就相当混乱,所以记录一下如何对数据按照时间排序。

    步骤一:

    格式化日期

       public static Date stringToDate(String dateString) {
            ParsePosition position = new ParsePosition(0);
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date dateValue = simpleDateFormat.parse(dateString, position);
            return dateValue;
        }

    步骤二:

    对拼接的列表进行排序

      private void sortData(ArrayList<CourseModel> mList) {
            Collections.sort(mList, new Comparator<CourseModel>() {
                /**
                 *
                 * @param lhs
                 * @param rhs
                 * @return an integer < 0 if lhs is less than rhs, 0 if they are
                 *         equal, and > 0 if lhs is greater than rhs,比较数据大小时,这里比的是时间
                 */
                @Override
                public int compare(CourseModel lhs, CourseModel rhs) {
                    Date date1 = DateUtil.stringToDate(lhs.getCREATE_TIME());
                    Date date2 = DateUtil.stringToDate(rhs.getCREATE_TIME());
                    // 对日期字段进行升序,如果欲降序可采用after方法
                    if (date1.before(date2)) {
                        return 1;
                    }
                    return -1;
                }
            });
            adapter.replaceAll(mList);
        }

    直接调用这个方法,数据类型改造一下即可

    展开全文
  • 很多安卓应用都有日期选择以及下拉列表的功能,具体就是下面图示的效果 具体代码实现如下 先写布局文件xml,style就不一一列举了,根据自己的需求写就好 &lt;?xml version="1.0" encoding="utf-...

    很多安卓应用都有日期选择以及下拉列表的功能,具体就是下面图示的效果
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    具体代码实现如下
    先写布局文件xml,style就不一一列举了,根据自己的需求写就好

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        style="@style/LinearLayout1">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="40dp">
            <TextView
                style="@style/TongjiTitle"
                android:text="添加新账"/>
        </LinearLayout>
        <LinearLayout
            android:layout_marginTop="5dp"
            style="@style/LinearLayout2">
            <TextView
                style="@style/addTextView"
                android:drawableRight="@mipmap/riqi"/>
            <EditText
                android:id="@+id/et_date"
                style="@style/addEditText"/>
            <TextView
                style="@style/addTextView"
                android:drawableRight="@mipmap/kinds"/>
            <Spinner
                android:id="@+id/spinner1"
                style="@style/addEditText"/>
        </LinearLayout>
        <LinearLayout
            android:layout_marginTop="5dp"
            style="@style/LinearLayout2">
            <TextView
                style="@style/addTextView"
                android:drawableRight="@mipmap/money"/>
            <EditText
                android:id="@+id/et_money"
                style="@style/addEditText"/>
            <TextView
                style="@style/addTextView"
                android:drawableRight="@mipmap/text"/>
            <EditText
                android:id="@+id/et_text"
                style="@style/addEditText"/>
        </LinearLayout>
        <LinearLayout
            style="@style/LinearLayout2"
            android:gravity="center">
            <Button
                android:id="@+id/btn_concel"
                style="@style/addButton"
                android:text="取消"/>
            <TextView
                android:layout_width="15dp"
                android:layout_height="60dp" />
            <Button
                android:id="@+id/btn_add"
                style="@style/addButton"
                android:text="确认添加"/>
        </LinearLayout>
    
    
    </LinearLayout>
    

    接下来是activity具体实现
    我是在继承Fragment的类写的,所以写在onCreateView方法里,如果是在继承AppCompatActivity的类中,则直接写在onCreate方法里就好。区别就是onCreateView中的findViewById前需要加上你定义的View,在使用 适配器ArrayAdapter时第一个参数不能用this,而要用getActivity(),这个很重要,我纠结了好久才解决。

     @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.addfragment, container, false);
            et_date=(EditText)rootView.findViewById(R.id.et_date);
            et_money=(EditText)rootView.findViewById(R.id.et_money);
            et_text=(EditText)rootView.findViewById(R.id.et_text);
            btn_add=(Button)rootView.findViewById(R.id.btn_add);
            btn_cancel=(Button)rootView.findViewById(R.id.btn_concel);
            dbOpenHelper=new MyDBOpenHelper(getActivity().getApplicationContext());
            //设置选择日期
            dateFormatter = new SimpleDateFormat("MM月dd日");//这里可以设置日期的格式,如果是年月日则改为yyyy年MM月dd日
            createDate= Calendar.getInstance();
            createDate.setTimeInMillis(System.currentTimeMillis());
            et_date.setText(dateFormatter.format(new Date(createDate.getTimeInMillis())));//把当前系统日期显示在TextView中,如果需要不显示注释掉即可
            et_date.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {
                        @Override
                        public void onDateSet(DatePicker datePicker, int year, int month, int day) {
                            createDate.set(year, month, day);
                            et_date.setText(dateFormatter.format(new Date(createDate.getTimeInMillis())));
                        }
                    }, createDate.get(Calendar.YEAR), createDate.get(Calendar.MONTH), createDate.get(Calendar.DAY_OF_MONTH))
                            .show();
                }
            });
    
            List<String> list = new ArrayList<String>();
            list.add("零花");
            list.add("吃饭");
            list.add("日常");
            list.add("学习");
            list.add("饭卡");
            //第一项也就是显示的为零花,如果不设置初始值,则第一项可直接设置为空list.add("");或者是常用的list.add("请选择类型");
            ArrayAdapter<String> adapter=new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item,list);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            final Spinner sp=(Spinner)rootView.findViewById(R.id.spinner1);
            sp.setAdapter(adapter);
    

    获取下拉列表框选中的值,我常用的方法如下,提取出选中项内容后就可以根据activity所需做相应处理了。

    Spring spr=sp.getSelectedItem().toString();
    
    展开全文
  • 调用自定义滑动日历选择控件效果:详解:1、实现一个滑动选择器声明:这个滑动选择器是网上淘的,但现在没找到原创,如有疑议,可以留言import android.content.Context; import android.graphics.Canvas; import ...

    实现步骤:

    1、实现一个滑动选择器

    2、自定义需要的布局

    3、为布局插入需要的数据,调用自定义滑动日历选择控件


    效果:



    详解:

    1、实现一个滑动选择器

    声明:这个滑动选择器是网上淘的,但现在没找到原创,如有疑议,可以留言

    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.Paint.Align;
    import android.graphics.Paint.FontMetricsInt;
    import android.graphics.Paint.Style;
    import android.os.Handler;
    import android.os.Message;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Timer;
    import java.util.TimerTask;
    
    /**
     * Created by Administrator on 2018/1/16 0016.
     * 视图选择器(滚动选择--日期、地区)定义滑动效果
     */
    
    public class CalendarView extends View {
        public static final String TAG = "CalendarView";
        /**
         * text之间间距和minTextSize之比
         */
        public static final float MARGIN_ALPHA = 2.8f;
        /**
         * 自动回滚到中间的速度
         */
        public static final float SPEED = 2;
    
        private List<String> mDataList;
        /**
         * 选中的位置,这个位置是mDataList的中心位置,一直不变
         */
        private int mCurrentSelected;
        private Paint mPaint;
    
        private float mMaxTextSize = 80;
        private float mMinTextSize = 40;
    
        private float mMaxTextAlpha = 255;
        private float mMinTextAlpha = 120;
    
        private int mColorText = 0x333333;
    
        private int mViewHeight;
        private int mViewWidth;
    
        private float mLastDownY;
        /**
         * 滑动的距离
         */
        private float mMoveLen = 0;
        private boolean isInit = false;
        private onSelectListener mSelectListener;
        private Timer timer;
        private MyTimerTask mTask;
    
        Handler updateHandler = new Handler() {
    
            @Override
            public void handleMessage(Message msg) {
                if (Math.abs(mMoveLen) < SPEED) {
                    mMoveLen = 0;
                    if (mTask != null) {
                        mTask.cancel();
                        mTask = null;
                        performSelect();
                    }
                } else
                    // 这里mMoveLen / Math.abs(mMoveLen)是为了保有mMoveLen的正负号,以实现上滚或下滚
                    mMoveLen = mMoveLen - mMoveLen / Math.abs(mMoveLen) * SPEED;
                    invalidate();
            }
    
        };
    
        public CalendarView(Context context) {
            super(context);
            init();
        }
    
        public CalendarView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        public void setOnSelectListener(onSelectListener listener) {
            mSelectListener = listener;
        }
    
        private void performSelect() {
            if (mSelectListener != null)
                mSelectListener.onSelect(mDataList.get(mCurrentSelected));
        }
    
        public void setData(List<String> datas) {
            mDataList = datas;
            mCurrentSelected = datas.size()/2;
            invalidate();
        }
    
        public void setSelected(int selected) {
            mCurrentSelected = selected;
        }
    
        private void moveHeadToTail() {
            String head = mDataList.get(0);
            mDataList.remove(0);
            mDataList.add(head);
        }
    
        private void moveTailToHead() {
            String tail = mDataList.get(mDataList.size() - 1);
            mDataList.remove(mDataList.size() - 1);
            mDataList.add(0, tail);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            mViewHeight = getMeasuredHeight();
            mViewWidth = getMeasuredWidth();
            // 按照View的高度计算字体大小
            mMaxTextSize = mViewHeight / 4.0f;
            mMinTextSize = mMaxTextSize / 2f;
            isInit = true;
            invalidate();
        }
    
        private void init() {
            timer = new Timer();
            mDataList = new ArrayList<String>();
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setStyle(Style.FILL);
            mPaint.setTextAlign(Align.CENTER);
            mPaint.setColor(mColorText);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            // 根据index绘制view
            if (isInit)
                drawData(canvas);
        }
    
        private void drawData(Canvas canvas) {
            // 先绘制选中的text再往上往下绘制其余的text
            float scale = parabola(mViewHeight / 4.0f, mMoveLen);
            float size = (mMaxTextSize - mMinTextSize) * scale + mMinTextSize;
            mPaint.setTextSize(size);
            mPaint.setAlpha((int) ((mMaxTextAlpha - mMinTextAlpha) * scale + mMinTextAlpha));
            // text居中绘制,注意baseline的计算才能达到居中,y值是text中心坐标
            float x = (float) (mViewWidth / 2.0);
            float y = (float) (mViewHeight / 2.0 + mMoveLen);
            FontMetricsInt fmi = mPaint.getFontMetricsInt();
            float baseline = (float) (y - (fmi.bottom / 2.0 + fmi.top / 2.0));
    
            canvas.drawText(mDataList.get(mCurrentSelected), x, baseline, mPaint);
            // 绘制上方data
            for (int i = 1; (mCurrentSelected - i) >= 0; i++) {
                drawOtherText(canvas, i, -1);
            }
            // 绘制下方data
            for (int i = 1; (mCurrentSelected + i) < mDataList.size(); i++) {
                drawOtherText(canvas, i, 1);
            }
    
        }
    
        /**
         * @param canvas
         * @param position
         *            距离mCurrentSelected的差值
         * @param type
         *            1表示向下绘制,-1表示向上绘制
         */
        private void drawOtherText(Canvas canvas, int position, int type) {
            float d = (float) (MARGIN_ALPHA * mMinTextSize * position + type
                    * mMoveLen);
            float scale = parabola(mViewHeight / 4.0f, d);
            float size = (mMaxTextSize - mMinTextSize) * scale + mMinTextSize;
            mPaint.setTextSize(size);
            mPaint.setAlpha((int) ((mMaxTextAlpha - mMinTextAlpha) * scale + mMinTextAlpha));
            float y = (float) (mViewHeight / 2.0 + type * d);
            FontMetricsInt fmi = mPaint.getFontMetricsInt();
            float baseline = (float) (y - (fmi.bottom / 2.0 + fmi.top / 2.0));
            canvas.drawText(mDataList.get(mCurrentSelected + type * position),
                    (float) (mViewWidth / 2.0), baseline, mPaint);
        }
    
        /**
         * 抛物线
         *
         * @param zero
         *            零点坐标
         * @param x
         *            偏移量
         * @return scale
         */
        private float parabola(float zero, float x) {
            float f = (float) (1 - Math.pow(x / zero, 2));
            return f < 0 ? 0 : f;
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                    doDown(event);
                    break;
                case MotionEvent.ACTION_MOVE:
                    doMove(event);
                    break;
                case MotionEvent.ACTION_UP:
                    doUp(event);
                    break;
            }
            return true;
        }
    
        private void doDown(MotionEvent event) {
            if (mTask != null) {
                mTask.cancel();
                mTask = null;
            }
            mLastDownY = event.getY();
        }
    
        private void doMove(MotionEvent event) {
    
            mMoveLen += (event.getY() - mLastDownY);
    
            if (mMoveLen > MARGIN_ALPHA * mMinTextSize / 2) {
                // 往下滑超过离开距离
                moveTailToHead();
                mMoveLen = mMoveLen - MARGIN_ALPHA * mMinTextSize;
            } else if (mMoveLen < -MARGIN_ALPHA * mMinTextSize / 2) {
                // 往上滑超过离开距离
                moveHeadToTail();
                mMoveLen = mMoveLen + MARGIN_ALPHA * mMinTextSize;
            }
    
            mLastDownY = event.getY();
            invalidate();
        }
    
        private void doUp(MotionEvent event) {
            // 抬起手后mCurrentSelected的位置由当前位置move到中间选中位置
            if (Math.abs(mMoveLen) < 0.0001) {
                mMoveLen = 0;
                return;
            }
            if (mTask != null) {
                mTask.cancel();
                mTask = null;
            }
            mTask = new MyTimerTask(updateHandler);
            timer.schedule(mTask, 0, 10);
        }
    
        class MyTimerTask extends TimerTask {
            Handler handler;
    
            public MyTimerTask(Handler handler) {
                this.handler = handler;
            }
    
            @Override
            public void run() {
                handler.sendMessage(handler.obtainMessage());
            }
    
        }
    
        public interface onSelectListener {
            void onSelect(String text);
        }
    }
    实现原理的话自己研究吧


    2、自定义需要的布局

    布局可以根据自己需要来,我的是这样的

    <?xml version="1.0" encoding="utf-8"?>
    <!--滑动选择日历的布局-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <LinearLayout
            android:id="@+id/customDialog"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingTop="20dp"
                android:paddingBottom="20dp"
                android:gravity="center"
                android:textColor="#000000"
                android:textSize="20sp"
                android:text="选择日期"/>
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">
    
                <com.win.customview.slide_calendar.CalendarView
                    android:id="@+id/year"
                    android:layout_weight="1"
                    android:layout_width="0dp"
                    android:layout_height="100dp"/>
    
                <com.win.customview.slide_calendar.CalendarView
                    android:id="@+id/month"
                    android:layout_weight="1"
                    android:layout_width="0dp"
                    android:layout_height="100dp"/>
    
                <com.win.customview.slide_calendar.CalendarView
                    android:id="@+id/day"
                    android:layout_weight="1"
                    android:layout_width="0dp"
                    android:layout_height="100dp"/>
    
            </LinearLayout>
    
        </LinearLayout>
    
    </LinearLayout>
    这个就是上面的滑动视图选择器 com.win.customview.slide_calendar.CalendarView

        因为有年月日,所以就有三个滑动视图选择器

        可根据自己的需要改变布局,如每个选择器后面加上 年、月、日 之类的字


    3、为布局插入需要的数据,调用自定义滑动日历选择控件

    为布局插入数据可以在用的时候写个方法将数据插入,调用时调用方法就好了

    以下是具体代码

    import android.content.DialogInterface;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.TextView;
    
    import com.win.customview.R;
    
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    
    //弹出一个弹框,通过滑动选择日历日期
    public class SlideCalendarActivity extends AppCompatActivity {
    
        private TextView data;//日期数据显示
        private Button data_base;//通过滑动日历选择
    
        private CalendarView calendarView1,calendarView2,calendarView3;
        //没有选择时,将会显示的日期,也可以根据系统获取当前时间
        private String years = "2018",months = "3", days = "13";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_slide_calendar);
            data = (TextView)findViewById(R.id.data);
            data_base = (Button)findViewById(R.id.data_base);
            data_base.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //点击弹出滑轮选择日历控件
                    myCalendar();
                }
            });
        }
    
        public void myCalendar(){
            //初始化对话框             R.style.CalendarDialog 是自定义的弹框主题,在styles设置
            final AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.CalendarDialog);
            //初始化自定义布局参数
            LayoutInflater layoutInflater = getLayoutInflater();
            //绑定布局
            View customLayout = layoutInflater.inflate(R.layout.view_slide_calendar, (ViewGroup) findViewById(R.id.customDialog));
            //为对话框设置视图
            builder.setView(customLayout);
    
            //加载年月日的三个 CalendarView 的 id
            calendarView1 = (CalendarView) customLayout.findViewById(R.id.year);
            calendarView2 = (CalendarView) customLayout.findViewById(R.id.month);
            calendarView3 = (CalendarView) customLayout.findViewById(R.id.day);
    
            //定义滚动选择器的数据项(年月日的)
            ArrayList<String> gradeYear = new ArrayList<>();
            ArrayList<String> gradeMonth = new ArrayList<>();
            ArrayList<String> gradeDay = new ArrayList<>();
    
            //为数据项赋值
            int thisYear = Integer.parseInt(new SimpleDateFormat("yyyy").format(new java.util.Date()));
            for(int i=1980;i<=thisYear;i++) //从1980到今年
                gradeYear.add(i + "");
            for(int i=1;i<=12;i++)            // 1月到12月
                gradeMonth.add(i + "");
            for(int i=1;i<=31;i++)           // 1日到31日
                gradeDay.add(i + "");
    
            //为滚动选择器设置数据
            calendarView1.setData(gradeYear);
            calendarView2.setData(gradeMonth);
            calendarView3.setData(gradeDay);
    
            //滚动选择事件
            calendarView1.setOnSelectListener(new CalendarView.onSelectListener() {
                @Override
                public void onSelect(String data) {
                    years = data;
                }
            });
            calendarView2.setOnSelectListener(new CalendarView.onSelectListener() {
                @Override
                public void onSelect(String data) {
                    months = data;
                }
            });
            calendarView3.setOnSelectListener(new CalendarView.onSelectListener() {
                @Override
                public void onSelect(String data) {
                    days = data;
                }
            });
    
            //对话框的确定按钮
            builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    data.setText(years + " 年 "+ months + " 月 " + days + " 日 ");
    
                }
            });
            //对话框的取消按钮
            builder.setNegativeButton("取消", null);
            //显示对话框
            builder.show();
    
    
        }
    }

    注意,在  myCalendar() 方法 中通过绑定布局、根据 id 为每一个视图选择器赋值,

    根据滚动选择事件获得选择的数据,将数据赋予定义的变量,这样就能够获取到数据了

    我们可以看到,赋予的值都是数字,但是是通过 add() 赋予的,这时,我们应该想到,

    是否字符串也能够实现滚动选择呢?   是的 如果你把数据放到数组中,

    通过 for 循环赋值给滚动选择器,这时,被选择的就可以是文字了,如下图示:



    不过要改成这样的,那么前面的省份改变时,后面的 市级 也需要对应更改,这就需要你们自己研究一下喽


    源码:https://github.com/iscopy/CustomView

    在 slide_calendar 包里面








    展开全文
  • 仿虎扑,带悬浮标题的PinnedSectionRefreshListView,帶下拉刷新的Demo,实现时间按照日期和时分秒进行分类.关于PinnedSectionRefreshListView中注释显示英文问题,可以下载...
  • 常用的表单组件中,比较复杂的是选择类的组件,这里可以使用以下的组件实现:单选,多选,下拉列表日期选择,时间选择的功能。 一、单选,多选: <LinearLayout xmlns:android=...

    Android中,也可以通过组件实现HTML表单中的各种功能,但这里不包含隐藏域的组件,因为没有必要。

    常用的表单组件中,比较复杂的是选择类的组件,这里可以使用以下的组件实现:单选,多选,下拉列表,日期选择,时间选择的功能。

    一、单选,多选:

    <LinearLayout 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:background="@drawable/login_bg"
        android:orientation="vertical"
        android:paddingBottom="5dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:paddingTop="5dp" >
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="性别: "
            android:textColor="#000000" />
    
        <RadioGroup
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
    
            <RadioButton
                android:text="男"
                android:textColor="#000000" />
    
            <RadioButton
                android:text="女"
                android:textColor="#000000" />
        </RadioGroup>
    
    </LinearLayout>

    单选应该还支持默认选中功能。

    <RadioButton
                android:text="男"
                android:checked="true"
                android:textColor="#000000" />

    但要注意,这样写有bug,如果写上为true,则永远无法再进行切换,一直为true

    因此建议在程序中进行默认选中的设置。

    RadioGroup
            android:id="@+id/radio"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
    public class MainActivity extends Activity {
    
    	private RadioGroup radio;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		// 设置所使用的布局界面
    		setContentView(R.layout.activity_main);
    
    		radio = (RadioGroup) findViewById(R.id.radio);
    
    		// 可以通过check()方法来设置选中某一个单选,但要传递该单选按钮的id值.
    		// 如果为每个单选按钮设置id, 比较麻烦,因此这里通过 按钮的position下标,直接取得按钮,再通过getId()取得id值来设置.
    		radio.check(radio.getChildAt(0).getId());
    
    	}
    }

    如果选项不是写死的形式,而是通过传递的集合数据动态生成的,可以通过程序来进行选项的建立。

    public class MainActivity extends Activity {
    
    	private RadioGroup radio;
    
    	private String[] allValues = { "男", "女", "未知" };
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		// 设置所使用的布局界面
    		setContentView(R.layout.activity_main);
    
    		radio = (RadioGroup) findViewById(R.id.radio);
    
    		// 可以通过check()方法来设置选中某一个单选,但要传递该单选按钮的id值.
    		// 如果为每个单选按钮设置id, 比较麻烦,因此这里通过 按钮的position下标,直接取得按钮,再通过getId()取得id值来设置.
    		// radio.check(radio.getChildAt(0).getId());
    
    		// 动态为单选按钮组加入选项
    		// 循环数组或集合,建立单选按钮
    		for (int i = 0; i < allValues.length; i++) {
    			RadioButton button = new RadioButton(this);
    			button.setText(allValues[i]);
    			button.setTextColor(Color.BLACK);
    			radio.addView(button);
    		}
    	}}

    多选框使用方法与单选基本相同,只不过换成CheckBox

    这里没有CheckBoxGroup,可以直接使用LinearLayout替代之前的RadioGroup

    <LinearLayout
            android:id="@+id/checkbox"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
    
            <CheckBox
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="巴厘岛"
                android:textColor="#000000" />
    
            <CheckBox
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="马尔代夫"
                android:textColor="#000000" />
    
            <CheckBox
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="三亚"
                android:textColor="#000000" />
    
            <CheckBox
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="香格里拉"
                android:textColor="#000000" />
    
            <CheckBox
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="马来西亚"
                android:textColor="#000000" />
        </LinearLayout>

    二、Spinner下拉列表

    下拉列表中的数据不能直接加入,可以通过XML来进行固定的配置,或使用Adpater来动态加入。

    写死的数据,可以打开values.xml,来加入一段配置。

    <Spinner
            android:id="@+id/spinner"
            android:entries="@array/area_array"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    //这里的@array的数据就是在strngs.xml中声明的String Array数组

    如果想动态生成数据,也要通过程序完成,需要建立一个ArrayAdapter的类,来转换传入的List集合或String[]数据。

    // 取得Spinner组件
    		spinner = (Spinner) findViewById(R.id.spinner);
    		// 根据数据,建立适配器
    		adapter = new ArrayAdapter<String>(this,
    				android.R.layout.simple_spinner_item, allAreaValues);
    		// 设置选项弹出后的显示样式
    		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    
    		spinner.setAdapter(adapter);


    //如果不想使用系统自带的显示样式,也可以自己在res/layout中声明一个自定义的TextView的样式。

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="wrap_content"
        android:textColor="#ff0000"
        android:textSize="15sp"
        android:layout_height="wrap_content" >
    
    </TextView>
    // 根据数据,建立适配器
    		adapter = new ArrayAdapter<String>(this,
    				R.layout.my_spinner_item, allAreaValues);

    三、日期时间选择器、滚动面板

    日期选择器的设置

    <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="选择生日: "
            android:textColor="#000000" />
    
        <DatePicker
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    但这时,内容已经超出了屏幕范围,因此需要加入一个滚动面版,来实现屏幕滚动的功能。

    滚动面版中要求只能有一个子节点。

    因此这里要将滚动面版ScrollView加入到最外面,作为根节点来使用

    <ScrollView 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" >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/login_bg"
            android:orientation="vertical"
            android:paddingBottom="5dp"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:paddingTop="5dp" >

    同时,里面的LinearLayout的高度,必须设置成为wrap_content

    如果想使用水平滚动支持,可以加入水平滚动面版

    还可以取消滚动条的显示

    <ScrollView 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:scrollbars="none" >

    时间选择也可以通过TimePicker来实现。

    <TimePicker
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
    
    
    
    
    
    
    
    
    
    展开全文
  • 实现按日期和大小排序 Android 摘要:经常看见有人还在不厌其烦的用冒泡(最常见!)或是交换做排序,实际上用几行代码就可以既快又好地实现排序,不论是简单类型还是类,数组还是Java聚集...

    实现按日期和大小排序 Android



    摘要:经常看见有人还在不厌其烦的用冒泡(最常见!)或是交换做排序,实际上用几行代码就可以既快又好地实现排序,不论是简单类型还是类,数组还是Java聚集(Collection)。

    简单类型的排序
    简单类型不外是byte, char, short, int, long, float, double等数据类型, 这些类型不能放在聚集中,只能使用数组。java.util.Arrays方法提供了对这些类型的sort方法(实际上还有很多其他有用的方法),下面是对一个简单的int数组排序:
       int[] arr = {2, 3, 1,10,7,4};

       System.out.print("before sort: ");
       for (int i = 0; i< arr.length; i++)
        System.out.print(arr[i] + " ");
       System.out.println();  

       Arrays.sort(arr);
       System.out.print("after sort: ");
       for (int i = 0; i< arr.length; i++)
        System.out.print(arr[i] + " ");
       System.out.println();  
    输出结果:
    before sort: 2 3 1 10 7 4 
    after sort: 1 2 3 4 7 10
    我们看到排序结果是按照升序排列的,下面的排序都是如此。

    对象的排序
    对象可以放在数组里,同样调用Arrays.sort(Object[] arr)即可;也可以放到聚集里,用java.util.Collections的sort(List list)。注意不是list必须实现List接口而不仅仅是Collection接口。
    但是这个类必须实现了java.lang.Comparable接口。这个接口只有一个方法:int compartTo(Object o),当本对象比传入的对象大时,返回一个正整数。 以类Programmer为例:
    class Programmer implements Comparable{
    private String name;
    private String language;
    private double pay;

    public Programmer(String name, String language, double pay) {
       this.name = name;
       this.language = language;
       this.pay = pay;
    }

    public int compareTo(Object o) {
       Programmer other = (Programmer)o;
       return (int)pay - (int)other.pay;
    }

    public String toString(){
       return "{name: " + name + ", language: " + language + ", money: " + pay + "}";
    }
    }
    对其进行排序:
       ArrayList list = new ArrayList();
       list.add(new Programmer("张三", "C", 12000));
       list.add(new Programmer("李四", "Java", 200));
       list.add(new Programmer("王五", "C++", 5000));
       list.add(new Programmer("钱六", "VB", 3000));
       System.out.println("before sort: " + list);
       Collections.sort(list);
       System.out.println("after sort: " + list); 
    输出:
    before sort: [{name: 张三, language: C, money: 12000.0}, {name: 李四, language: Java, money: 200.0}, {name: 王五, language: C++, money: 5000.0}, {name: 钱六, language: VB, money: 3000.0}]
    after sort: [{name: 李四, language: Java, money: 200.0}, {name: 钱六, language: VB, money: 3000.0}, {name: 王五, language: C++, money: 5000.0}, {name: 张三, language: C, money: 12000.0}]

    够简单吧!查查Comparable的javadoc可以知道,有很多类已经实现了该接口,因此对这些类的排序几行代码就可以搞定。
    最近看C#发现其中用System.Array.sort对数组排序,适用于所有实现了IComparable接口的对象,看来微软的借鉴能力还真是强啊!

    对已有类进行排序
    上面的方法有一个问题,就是一个类已经存在了,并且没有实现Comparable接口,使用一个子类进行封装?很麻烦(你可以对下面的例子试试)。还有一种情况就是对一个类没法实现多种排序。以File类为例,它实现了Comparable接口,但是是按照名称排序的。如果要按照大小排序,或者按修改时间排序呢?对这两种情况,使用java.util包的Comparator接口:
    Arrays.sort(Object[] arr, Comparator com)
    Collections.sort(Object[] arr, Comparator com)
    Comparator接口的方法:
    public int compare(Object o1, Object o2) 当o1比o2大时返回一个正整数
    public boolean equals(Object obj) 判断obj与这个Comparator是否同一个对象
    下面使用Comparator对文件实现了按文件大小或修改时间排序:
    class FileUtils {
    static class CompratorByLastModified implements Comparator {
       public int compare(Object o1, Object o2) {
        File file1 = (File)o1;
        File file2 = (File)o2;
        long diff = file1.lastModified() - file2.lastModified();
        if (diff > 0)
         return 1;
        else if (diff == 0)
         return 0;
        else
         return -1;
       }
      
       public boolean equals(Object obj){
        return true; //简单做法
       }
    }

    static class CompratorBySize implements Comparator {
       public int compare(Object o1, Object o2) {
        File file1 = (File)o1;
        File file2 = (File)o2;
        long diff = file1.length() - file2.length();
        if (diff > 0)
         return 1;
        else if (diff == 0)
         return 0;
        else
         return -1;
       }
      
       public boolean equals(Object obj){
        return true; //简单做法
       }
    }

    }
    调用的示例:
       File dir = new File("C:\\temp");
       File[] files = dir.listFiles();

       System.out.print("before sort: ");
       for (int i = 0; i< files.length; i++)
        System.out.print(files[i] + " ");
       System.out.println();  
      
       Arrays.sort(files);
       System.out.print("sort by name: ");
       for (int i = 0; i< files.length; i++)
        System.out.print(files[i] + " ");
       System.out.println();  

       Arrays.sort(files, new FileUtils.CompratorBySize());
       System.out.print("sort by size: ");
       for (int i = 0; i< files.length; i++)
        System.out.print(files[i] + " ");
       System.out.println();  

       Arrays.sort(files, new FileUtils.CompratorByLastModified());
       System.out.print("sort by last modified: ");
       for (int i = 0; i< files.length; i++)
        System.out.print(files[i] + " ");
       System.out.println();  
      
    自己找个目录试一下吧。用这些Java类库中的方法,一般情况下应该是不用自己写排序算法了吧?

    最后附上完整代码占点版面:
    TestSort.java
    import java.io.*;
    import java.util.*;

    public class TestSort {

    public static void main(String[] args) {
       sortSimpleType();
       sortComparable();
       sortComparator();
    }

    public static void sortSimpleType() {
       int[] arr = {2, 3, 1,10,7,4};

       System.out.print("before sort: ");
       for (int i = 0; i< arr.length; i++)
        System.out.print(arr[i] + " ");
       System.out.println();  

       Arrays.sort(arr);
       System.out.print("after sort: ");
       for (int i = 0; i< arr.length; i++)
        System.out.print(arr[i] + " ");
       System.out.println();  
    }

    public static void sortComparable() {
       ArrayList list = new ArrayList();
       list.add(new Programmer("张三", "C", 12000));
       list.add(new Programmer("李四", "Java", 200));
       list.add(new Programmer("王五", "C++", 5000));
       list.add(new Programmer("钱六", "VB", 3000));
       System.out.println("before sort: " + list);
       Collections.sort(list);
       System.out.println("after sort: " + list); 
    }

    public static void sortComparator() {
       File dir = new File("C:\\temp");
       File[] files = dir.listFiles();

       System.out.print("before sort: ");
       for (int i = 0; i< files.length; i++)
        System.out.print(files[i] + " ");
       System.out.println();  
      
       Arrays.sort(files);
       System.out.print("sort by name: ");
       for (int i = 0; i< files.length; i++)
        System.out.print(files[i] + " ");
       System.out.println();  

       Arrays.sort(files, new FileUtils.CompratorBySize());
       System.out.print("sort by size: ");
       for (int i = 0; i< files.length; i++)
        System.out.print(files[i] + " ");
       System.out.println();  

       Arrays.sort(files, new FileUtils.CompratorByLastModified());
       System.out.print("sort by last modified: ");
       for (int i = 0; i< files.length; i++)
        System.out.print(files[i] + " ");
       System.out.println();  
      
    }
    }

    class Programmer implements Comparable{
    private String name;
    private String language;
    private double pay;

    public Programmer(String name, String language, double pay) {
       this.name = name;
       this.language = language;
       this.pay = pay;
    }

    public int compareTo(Object o) {
       Programmer other = (Programmer)o;
       return (int)pay - (int)other.pay;
    }

    public String toString(){
       return "{name: " + name + ", language: " + language + ", money: " + pay + "}";
    }
    }

    class FileUtils {
    static class CompratorByLastModified implements Comparator {
       public int compare(Object o1, Object o2) {
        File file1 = (File)o1;
        File file2 = (File)o2;
        long diff = file1.lastModified() - file2.lastModified();
        if (diff > 0)
         return 1;
        else if (diff == 0)
         return 0;
        else
         return -1;
       }
      
       public boolean equals(Object obj){
        return true; //简单做法
       }
    }

    static class CompratorBySize implements Comparator {
       public int compare(Object o1, Object o2) {
        File file1 = (File)o1;
        File file2 = (File)o2;
        long diff = file1.length() - file2.length();
        if (diff > 0)
         return 1;
        else if (diff == 0)
         return 0;
        else
         return -1;
       }
      
       public boolean equals(Object obj){
        return true; //简单做法
       }
    }

    展开全文
  • android开发的应用程序中,通常会有对时间和日期选择的需求,而把日期和时间以对话框的形式显现出来既不会占用屏幕的太多的空间,又看起来很协调。DatePickerDialog和TimePickerDialog是Android提供的可以弹出一个...
  • Android日期及时间选择对话框 清单文件 xml version="1.0" encoding="utf-8"?> manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ljq.dialog" android:versionCode=...
  • 有时候我们会有需要在日历上选择一个日期范围的这种需求,先选一个开始日期,然后再选结束日期,如酒店入住日期和离店日期选择,美团携程这种预定酒店的app都有这种操作。那么这种需求该如何实现呢?先看一下要实现...
  • 以下代码是计算两个日期之间的天数,并打印所有日期 注:开始时,增加天数时,一天的毫秒数直接用24*60*60*1000来逐步增加天数,再测试时发现,当两个日期之间的天数超过24天时,打印的日期反而在开始日期之前了,...
  • 函数功能: 天日期转换周日期 输入数据: String: 日期yyyy-MM-dd, Integer: 步数. 输出数据: int[]: 周步数(7天, 周日至周六); ArrayList, String>>: 日期[星期, 日期号]数组; 空数组用[null, -1]填充. /** *...
  • Android使用RadioButton结合ListView显示对话框单选按钮列表有时候对话框的单选按钮列表不能满足我们的的设计需求,因为有时候按钮右边不一定是文字,有可能是文件加图片,或多个文字字段的一行内容,这时我们就需要...
  • 日期选择需求,展示年月和当月所有日期的同时,能够动态切换日期,同时今天要特别显示 分析: 页面元素主要包括,年 月 一个月的天和天对应的星期名 用户操作交互时, 首次进入需要获取当前日期的 年 月 和...
  • 目前还没有写出这个demo,不过可以参考下面这两个链接,一个是显示日期的,还有一个是合并单元格: 合并单元格: http://1029457926.iteye.com/blog/2295528 显示日期: ...
  • NumberPicker是Android3.0之后引入的一个控件,在以后的TimePicker和DatePicker时间控件里边都有引用,NumberPicker本身并没有提供接口给开发者修改其默认外观,这里延续前篇博客的内容( 调整TimePicker,...
  • 这篇文章主要为大家详细介绍了android listview实现新闻列表展示效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了android listview列表展示效果的具体代码,供大家参考,具体内容...
  • Android 自带 的 日期选择器和时间选择器 为DatePicker 和 TimePicker,一个是 年月日选择器,一个是时分 选择 器。 而在 Android 不同 的 API 下 它们的 显示 样式 也不同。 因为 此次封装 是在 弹框中显示 的 ,...
  • 1、下拉列表  android:id="@+id/eduSpinner"  android:layout_width="fill_parent"  android:layout_height="wrap_content"> public class MainActivity extends AppCompatActivity {
  • 本例使用到的类比较多,所使用的自定义的控件都是老外写好的,我知识根据他给的滑动的空间的基础上美化下和添加图片罢了,不多说直接看图: ... xmlns:android="http://schemas.android.com...
  • 直接复制粘贴就可以用,... * 获取当前日期前后N天的日期 支持 yyyy-MM-dd ,yyyy/MM/dd * MM/dd , yyyy/MM/dd HH:mm:ss , yyyy-MM-dd HH:mm:ss * ps:还有很多日期格式你可根据自己需求自行测试,绝对完美支持。 ...
1 2 3 4 5 ... 20
收藏数 18,489
精华内容 7,395
关键字:

android 按日期列表