RecyclerView样式的日历选择器

    看到携程,飞猪上面的日历选择,比如飞机票选择里的日历,这里就会是列表形式的日历选择,这上面会有还会展示价格,折扣之类的东西。但是这个有个缺点,就是固定了从哪一天到哪一天,而且是对于未来某段时间的展示,如果要展示之前的呢,要无限加载呢?下面就来看看我所实现的效果吧:

RecyclerView样式的日历选择器_第1张图片

 

实现效果就是这样,无限下拉加载更多日历,然后每个日期的的item也是可以自定义,加上点加上背景,字体设置都是可以的。




    

        

            

            


        

        

        

        
    



这就是基本布局,分为两部分的RecyclerView,上面那个展示的是星期,下面的那部分展示的就是日期了。对于日期就是要分月份和天的展示,天的展示其实也是在一个RecyclerView中,有的有些疑问,滑动冲突怎么办?页面展示不好怎么办?对于RecyclerView嵌套RecyclerView最方面的就是item的高度要么写死要么wrap_content。类似于下面这样:





    


    

那么剩下的就是数据的来源了,主要就是利用系统自带的Calendar对象了,我现在做的事每次加载一年的数据,每次加载之后就修改Calendar,然后在set数据时候根据你想要的的日期可以自己自定义数据然后再adapter的时候获取出来进行想要样式的展示了。

private int year, month, day;
    private int nowDay;
    private int currentI = 0;
    private List monthList = new ArrayList<>();
    private Calendar calendar = Calendar.getInstance();

    private void setMonthData(CalendarMonthAdapter calendarDayAdapter) {

        for (int i = 0; i < 12; i++) {
            List deList = new ArrayList<>();
            MonthEntity monthEntity = new MonthEntity();
            int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
            int empty = calendar.get(Calendar.DAY_OF_WEEK);
            empty = empty == 1 ? 6 : empty - 2;
            for (int j = 0; j < empty; j++) {
                DateEntity de = new DateEntity();
                de.setType(1);
                deList.add(de);
            }
            for (int j = 1; j <= maxDayOfMonth; j++) {
                DateEntity de = new DateEntity();
                if (currentI == 0) {
                    if (j > nowDay) {
                        de.setType(4);
                    } else if (j == nowDay) {
                        de.setType(2);
                    } else {
                        de.setType(0);

                    }

                } else {
                    de.setType(0);
                }
                de.setMonth(calendar.get(Calendar.MONTH) + 1);
                de.setDate(j);
                de.setParentPos(currentI);
                de.setDesc(Lunar.getLunarDate(year, month + 1, j));
                deList.add(de);
            }
            currentI++;
            year = calendar.get(Calendar.YEAR);
            month = calendar.get(Calendar.MONTH) + 1;
            monthEntity.setTitle(year + "年" + month + "月");
            monthEntity.setYear(year);
            monthEntity.setList(deList);
            monthList.add(monthEntity);

            calendar.add(Calendar.MONTH, -1);
        }
        calendarDayAdapter.loadMoreComplete();
        calendarDayAdapter.notifyDataSetChanged();
    }

由上面的可以看出我是根据type来区分不同的日期了,因此在我实现天的adapter中就根据这个来展示不同的样式了:

public class CalendarDayAdapter extends BaseQuickAdapter {


    public CalendarDayAdapter(List data) {
        super(R.layout.item_task_day, data);

    }


    @Override
    protected void convert(BaseViewHolder helper, DateEntity item) {
        if (item == null) {
            return;
        }
        RelativeLayout rl_content = helper.getView(R.id.rl_content);
        View view_bg = helper.getView(R.id.view_bg);
        View view_point = helper.getView(R.id.view_point);
        view_bg.setVisibility(View.GONE);
        view_point.setVisibility(View.GONE);
        TextView tv_date = helper.getView(R.id.tv_date);
        tv_date.setTextColor(Color.parseColor("#999999"));
        if (item.getType() == 1) {//留白
            tv_date.setText("");
            view_point.setVisibility(View.GONE);
        } else if (item.getType() == 2) {
            //今天
            view_bg.setVisibility(View.VISIBLE);
            tv_date.setText(item.getDate() + "");

        } else if (item.getType() == 0) {
            view_bg.setVisibility(View.GONE);
            tv_date.setText(item.getDate() + "");
        } else if (item.getType() == 4) {
            //今天之后的
            view_point.setVisibility(View.GONE);
            view_point.setVisibility(View.VISIBLE);
            tv_date.setTextColor(Color.parseColor("#303030"));
            tv_date.setText(item.getDate() + "");
        }

    }

}

 

基本上就实现了,下面是下载链接地址:

https://download.csdn.net/download/greatdaocaoren/12673449

 

有兴趣可以看看下面服务号和订阅号:

 

 

 

 

你可能感兴趣的:(Android,java,android)