• 团队冲刺第九天


    昨天的问题解决了,新建了一个文件,就不知为什么不闪退了,今天日历出来了,并且想把签到的信息存放到数据库中,今天完成了部分数据库创建的代码,明天希望可以有很大的突破,相关代码如下:

    package com.example.rili.view;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    import com.example.rili.DateAdapter;
    import com.example.rili.DateUtil;
    import com.example.rili.R;
    
    //签到控件
    
    public class SignView extends LinearLayout {
    
        private TextView tvYear;
        private SignGridView gvDate;
        private DateAdapter adapterDate;
    
        public SignView(Context context) {
            super(context);
            init();
        }
    
        public SignView(Context context,AttributeSet attrs){
            super(context,attrs);
            init();
        }
        public SignView(Context context, AttributeSet attrs,int defStyleAttr){
            super(context,attrs,defStyleAttr);
            init();
        }
    
        public void init(){
            init(DateUtil.year,DateUtil.month);
        }
    
        public void init(int year,int month){
            View view=View.inflate(getContext(), R.layout.layout_signdate,this);
            tvYear=view.findViewById(R.id.tvYear);
            gvDate=view.findViewById(R.id.gvDate);
            tvYear.setText(year+"-"+month);
            adapterDate=new DateAdapter(getContext(),year,month);
            gvDate.setAdapter(adapterDate);
        }
    
        public void signIn(DateAdapter.OnSignListener onSignListener){
            adapterDate.signIn(onSignListener);
        }
    
        public boolean isSign(){
            return adapterDate.isSign();
        }
    }
    View Code
    package com.example.rili;
    
    import android.content.Context;
    import android.graphics.Color;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    
    import com.example.rili.sign.SignInHelper;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class DateAdapter extends BaseAdapter {
    
        private static final String TAG = "DateAdapter--->>>";
    
        private Context context;
        //日历坐标数据 根据布尔值设置是否签到
        private List<Integer> days=new ArrayList<>();
        //签到状态,用来判断坐标中哪个位置是已经签到的
        private List<Boolean> status=new ArrayList<>();
    
        private List<String> signIns;//数据库查到的签到记录
        private int maxDay,firstDay,dif;
    
        private int current_year,current_mon;
        private SignInHelper helper;
        public interface OnSignListener{
            void OnSignedSucceed();
            void OnSignedFail();
        }
    
        //签到成功的回调方法,相应的可自行添加签到失败时的回调方法
        public DateAdapter(Context context,int year,int month){
            this.context=context;
            current_year=year;
            current_mon=month;
            helper=new SignInHelper(context);
            signIns=helper.query(year,month);
            //log.i(TAG,"查到的数据:"+signIns);
            //获取当月天数
            maxDay=DateUtil.getCurrentMonthLastDay(year,month);
            //firstDay(1-7)  获取当月第一天是星期几,星期日是第一天, 数字为1,代表这个月的第一天是星期天,依次类推
            firstDay=DateUtil.getFirstDayOfMonth(year,month);
    
            /*
            dif,实际定义的status坐标与日期是有差异的,经过实验和对比后,发现在显示已经签到的日期格子时,
           显示的位置与实际位置总是有差别,即有时候在签到日期是8号,但是打勾的是6号日期的格子。经过查询规律发现,
            这个偏差是与firstDay变量有关的,而这个偏差的值为firstDay -2, firstDay取值范围为1-7,这样的话
            dif取值范围即为(-1,5) 当该月的第一天为星期一时,此时firstDay取值为2,dif为0,此时才不存在偏差 否则
            其他情况都存在偏差(例如Calendar中默认星期天为第一天,此时的Calendar.DAY_OF_WEEK取值为 1 但
             gridView默认坐标从0开始,此时需要加上偏差 这时的偏差dif= 1-2=-1)
             */
    
            dif=firstDay-2;
            for(int i=0;i<firstDay-1;i++){
                days.add(0);//0代表需要隐藏的item
                status.add(false);//false表示签到状态
            }
    
            for (int i = 0; i < maxDay; i++) {
                days.add(i+1);
                //初始化日历数据
                status.add(false);
                //初始化日历签到状态
            }
            status = DateUtil.dateConvert(current_year, current_mon,signIns,status,dif);
    
        }
        @Override
        public int getCount() {
            return days.size();
        }
    
        @Override
        public Object getItem(int position) {
            return days.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(final int i, View view, ViewGroup viewGroup) {
            ViewHolder viewHolder;
            if(view==null){
                view = LayoutInflater.from(context).inflate(R.layout.item_gv,null);
                viewHolder = new ViewHolder();view.setTag(viewHolder);
            }else{
                viewHolder = (ViewHolder) view.getTag();
            }
            viewHolder.tv = view.findViewById(R.id.tvWeek);
            viewHolder.rlItem = view.findViewById(R.id.rlItem);
            viewHolder.ivStatus = view.findViewById(R.id.ivStatus);
            viewHolder.tv.setText(days.get(i)+"");
            if(days.get(i)==0){  //接着上个月的残留日期
                viewHolder.rlItem.setVisibility(View.GONE);
            }
            if(status.get(i)){
                viewHolder.tv.setTextColor(Color.parseColor("#FD0000"));
                viewHolder.ivStatus.setVisibility(View.VISIBLE);
            }else{
                viewHolder.tv.setTextColor(Color.parseColor("#666666"));
                viewHolder.ivStatus.setVisibility(View.GONE);
            }
            return view;
        }
    
    
        class ViewHolder{
            RelativeLayout rlItem;
            TextView tv;
            ImageView ivStatus;
        }
    
    
        public void signIn(OnSignListener listener){
            helper.insert(DateUtil.current);
            notifyDataSetChanged();
            listener.OnSignedSucceed();
        }
    
    
    
        public boolean isSign(){
            return status.get(DateUtil.day+dif);
        }
    }
    View Code

    代码运行截图:

  • 相关阅读:
    后缀零
    vs2019 MFC的安装 解决 此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。
    矩形切割
    fsync: failed to connect to feed.openvas.org (89.146.224.58)
    How to Install GVM Trial With VMware Workstation Player/Pro
    GVM 21.04 (stable, initial release 20210416)
    gitlab 升级相关
    Adobe Reader XI 11.0.23 简体中文版
    gofileserver GO HTTP 文件下载服务器
    KVM 中安装 Windows 10 虚拟机、CentOS 8 虚拟机及快照操作
  • 原文地址:https://www.cnblogs.com/hhjing/p/12764600.html
Copyright © 2020-2023  润新知