package com.example.pg_helper;

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.TextView;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Set;

public class CalendarAdapter extends BaseAdapter {
    private Context context;
    private List<Date> dates;
    private Calendar currentDate;
    private SimpleDateFormat dateFormat = new SimpleDateFormat('dd', Locale.getDefault());
    private Set<Date> markedDates;
    private OnDateClickListener onDateClickListener;

    public CalendarAdapter(Context context, List<Date> dates, Calendar currentDate, Set<Date> markedDates) {
        this.context = context;
        this.dates = dates;
        this.currentDate = currentDate;
        this.markedDates = markedDates;
    }

    @Override
    public int getCount() {
        return dates.size();
    }

    @Override
    public Object getItem(int position) {
        return dates.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;

        if (view == null) {
            LayoutInflater inflater = LayoutInflater.from(context);
            view = inflater.inflate(R.layout.calendar_item, parent, false);
        }

        TextView tvDate = view.findViewById(R.id.tv_date);
        Date date = dates.get(position);
        tvDate.setText(dateFormat.format(date));

        if (date.getMonth() != currentDate.getTime().getMonth()) {
            tvDate.setTextColor(Color.GRAY);
        } else {
            tvDate.setTextColor(Color.BLACK);
        }

        if (markedDates.contains(date)) {
            tvDate.setBackgroundResource(R.drawable.classtable); // 设置已打卡日期的背景样式
        } else {
            tvDate.setBackground(null); // 清除未打卡日期的背景样式
        }

        tvDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onDateClickListener != null) {
                    onDateClickListener.onDateClick(date);
                }
            }
        });

        return view;
    }

    public void setOnDateClickListener(OnDateClickListener listener) {
        this.onDateClickListener = listener;
    }

    public interface OnDateClickListener {
        void onDateClick(Date date);
    }
}

代码解释:

  • CalendarAdapter 类继承自 BaseAdapter, 用于为自定义日历视图提供数据和视图。
  • markedDates 是一个 Set 集合,用于存储需要特殊标记的日期,例如已打卡日期。
  • getView() 方法负责为日历中的每个日期创建和设置视图。
  • 使用 tvDate.setBackgroundResource() 方法设置已打卡日期的背景样式。
  • setOnDateClickListener() 方法用于设置日期点击监听器。
  • OnDateClickListener 接口定义了日期点击事件的回调方法 onDateClick()

使用方法:

  1. 在你的 Activity 或 Fragment 中创建一个 CalendarAdapter 实例,并将日期数据和已打卡日期传递给它。
  2. 使用 setOnDateClickListener() 方法为 CalendarAdapter 设置日期点击监听器。
  3. 在 onDateClick() 回调方法中处理日期点击事件,例如显示一个对话框或跳转到另一个 Activity。

通过以上步骤,你就可以在你的 Android 应用中创建一个自定义的日历视图,并实现标记特殊日期和处理点击事件的功能。

Android自定义日历视图:标记特殊日期并处理点击事件

原文地址: https://www.cveoy.top/t/topic/bkmM 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录