Android 类似于仿日历选择 区间变色
短信预约 -IT技能 免费直播动态提醒
因为之前疫情原因,加上家里有些事情,就一直没有发文章. 刚好最近一个朋友问到我一个小需求,类似于一个日历布局的页面,需要根据服务端传递过来的起始与结束日期将起始与结束日期变颜色,区间也变换颜色,就写的一个小demo,刚好分享一下:最下面有提供demo, 设置的0积分,后面平台可能会变动, 有需要的评论区留言邮箱,我发邮箱
不说了,还是先上效果图:
整个布局使用的是一个网格布局.
主要分为4个部分,
1: 白色区域
2:开始点
3:结束点
4:中间部分
其实开始和结束部分目前颜色是相同的.但是为了防止需求改动,就分开了
封装一个实体类,里面存了每个条目的标识与文本
private int flag;
private String text;
public RangeBean(int flag,String text){
this.flag = flag;
this.text = text;
}
public int getFlag() {
return flag;
}
public void setFlag(int flag) {
this.flag = flag;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
写一个全局的常量参数,来作为固定的标识,直接写,防止错乱,记不住
//外面
public final static int BOX_OUT = 1;
//开始
public final static int BOX_START = 2;
//结束
public final static int BOX_END = 3;
//里面
public final static int BOX_IN = 4;
在适配器中封装一个方法,来根据不同标识返回不同的颜色,在适配器的onBindViewHolder中给条目布局设置背景颜色
private int getBoxBgColor(int flag) {
int boxBgColor = R.color.box_out;
//根据不同的标识符来返回颜色
switch (flag) {
case RangeBean.BOX_OUT:
boxBgColor = R.color.box_out;
break;
case RangeBean.BOX_START:
boxBgColor = R.color.box_start_end;
break;
case RangeBean.BOX_END:
boxBgColor = R.color.box_start_end;
break;
case RangeBean.BOX_IN:
boxBgColor = R.color.box_in;
break;
}
return boxBgColor;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.tvNum.setText(rangeBeanList.get(position).getText());
holder.tvNum.setBackgroundColor(context.getResources().getColor(getBoxBgColor(rangeBeanList.get(position).getFlag())));
}
数据默认全部为没选择,北京全部为白色
private void initData() {
//默认全部白色背景
for (int i = 0; i < 30; i++) {
rangeList.add(new RangeBean(RangeBean.BOX_OUT, (i + 1) + ""));
}
rangeAdapter.notifyDataSetChanged();
}
在点击时,给每个指定的条目变换指定的颜色,详情看注释
private void renderView(int startDate, int endDate) {
//先全部置为白色
for (int i = 0; i < rangeList.size(); i++) {
rangeList.get(i).setFlag(RangeBean.BOX_OUT);
}
rangeAdapter.notifyDataSetChanged();
//开始绘制当前的点(因为数组下标是从0开始的,所以当前输入的值减1),算作是开始和结束的点
rangeList.get(startDate - 1).setFlag(RangeBean.BOX_START);
rangeList.get(endDate - 1).setFlag(RangeBean.BOX_END);
//从输入的值的位置(输入值的位置比下标往后一位),也就是说下标的后一位,算作是区间里面,到结束点下标的前一个
for (int i = startDate; i < endDate - 1; i++) {
rangeList.get(i).setFlag(RangeBean.BOX_IN);
}
//这个区间刷新
rangeAdapter.notifyItemRangeChanged(startDate - 1, endDate - startDate + 1);
}
下载地址: Android 仿日历区间选择变色
zpf_ 原创文章 87获赞 112访问量 32万+ 关注 私信 展开阅读全文作者:zpf_
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341