Android 签到功能

最近做了个签到功能,特地拿出来分享!
仅供学习!!

先上效果图:
在这里插入图片描述
签到后会有图标,具体效果可以自行更改。

项目的构成:
在这里插入图片描述

来看看布局文件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);//设置签到表日期
    }

重要的代码基本就是这些了,有兴趣的同学可以下载来看看!谢谢!!

下载链接:签到功能!!!

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值