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