最近做了个签到功能,特地拿出来分享!
仅供学习!!
先上效果图:
签到后会有图标,具体效果可以自行更改。
项目的构成:
来看看布局文件dialog_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/sign"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentTop="true">
<TextView
android:id="@+id/tv_sign"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textColor="#2fbbef"
android:textSize="15sp"
android:text="签到" />
<ImageView
android:id="@+id/close_sign"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:src="@drawable/close"
android:layout_marginRight="10dp"/>
</RelativeLayout>
<GridView
android:id="@+id/week"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_below="@+id/sign"
android:background="#7dc5eb"
android:clickable="false"
android:clipChildren="false"
android:columnWidth="50dp"
android:listSelector="@null"
android:numColumns="7"
android:stretchMode="columnWidth">
</GridView>
<GridView
android:id="@+id/days"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/week"
android:clickable="false"
android:clipChildren="false"
android:columnWidth="30dp"
android:listSelector="@null"
android:numColumns="7"
android:paddingBottom="1dp"
android:stretchMode="columnWidth"
android:verticalSpacing="1dp">
</GridView>
</RelativeLayout>
适配器:
/**
* 签到日期适配器
* @author JZ
* @time 31/03/2021
*/
public class DaysAdapter extends BaseAdapter {
private Context context;
private List list;
public DaysAdapter(Context context, List list){
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null){
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.item_days,null);
viewHolder.days= (TextView) convertView.findViewById(R.id.tv_day);
viewHolder.sign= (ImageView) convertView.findViewById(R.id.img_sign);
convertView.setTag(viewHolder);
}else {
viewHolder = (ViewHolder) convertView.getTag();
}
//获取今天是几号
String today = TimeUtil.getInstance().day;
/**
* 签到状态
* false :表示未签到
* true :表示已签到
*/
SpUtil sp = new SpUtil(context);
Boolean isSigned = sp.getSigned(position);
//下一个月,清空上月签到记录
if (today.equals("1")){
sp.clearAll();
}
viewHolder.days.setText(list.get(position)+"");
viewHolder.days.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String signDay = viewHolder.days.getText().toString();
/**
* 判断当前点击的签到日期是否和系统当天时间一致
*/
if (signDay.equals(today)){
/**
* 点击签到
* 签到成功,发放奖励
* 签到成功标签
* 改变背景色,变成不可点击
*/
viewHolder.sign.setVisibility(View.VISIBLE);
viewHolder.days.setClickable(false);
viewHolder.days.setTextColor(Color.rgb(125,197,235));
sp.setSigned(position);//签到成功,保存状态
}
}
});
//已签到,显示签到标签
if (isSigned == true){
viewHolder.sign.setVisibility(View.VISIBLE);
viewHolder.days.setClickable(false);
}
return convertView;
}
class ViewHolder{
private ImageView sign;
private TextView days;
}
}
这里的代码比较多一点。这里设置签到表的值,签到的状态,是否已经签到,发放奖励等。
重点:签到表数据
接下来就是签到功能重要的地方了,获取当前时间,时间所在月份,所在月份的第一天是星期几,所在月份的最大天数
/**
* 设置每月签到表
* 每月第一天是周几
*/
public void setSignTable(Context context, GridView week, GridView days){
List dayList = new ArrayList();
int num = 0;
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.setTimeInMillis(cal.getTimeInMillis());
//当前月天数
int maxDys = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
for (int i = 1; i <= maxDys; i++){
dayList.add(i);
}
int day = cal.get(Calendar.DAY_OF_WEEK);
switch (day % 7) {
case 0:
//周六
num = 6;
break;
case 1:
//周日
num = 0;
break;
case 2:
//周一
num = 1;
break;
case 3:
//周二
num = 2;
break;
case 4:
//周三
num = 3;
break;
case 5:
//周四
num = 4;
break;
case 6:
//周五
num = 5;
break;
}
//每月第一天是周几,前面的用空格代替
for (int i = 0; i < num;i++){
dayList.add(i,"");
}
getToDay();//获取今天是几号
setWeekDays(context,week);//设置签到表title
setDays(context,days,dayList);//设置签到表日期
}
重要的代码基本就是这些了,有兴趣的同学可以下载来看看!谢谢!!
下载链接:签到功能!!!