Android自定义CalendarView实现日期选择功能
以下是一个完整的自定义CalendarView代码,它包含了日期点击事件处理、日期标记等功能:
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
public class CalendarView extends LinearLayout {
private Context context;
private GridView gridView;
private TextView tvMonth;
private CalendarAdapter adapter;
private Calendar currentDate = Calendar.getInstance();
private SimpleDateFormat dateFormat = new SimpleDateFormat("MMMM yyyy", Locale.getDefault());
private Set<Date> markedDates = new HashSet<>();
private OnDateClickListener onDateClickListener;
public CalendarView(Context context) {
super(context);
this.context = context;
initialize();
}
public CalendarView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
initialize();
}
public CalendarView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
initialize();
}
private void initialize() {
LayoutInflater inflater = LayoutInflater.from(context);
inflater.inflate(R.layout.calendar_view, this);
gridView = findViewById(R.id.gridview);
tvMonth = findViewById(R.id.tv_month);
findViewById(R.id.btn_prev).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
currentDate.add(Calendar.MONTH, -1);
updateCalendar();
}
});
findViewById(R.id.btn_next).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
currentDate.add(Calendar.MONTH, 1);
updateCalendar();
}
});
updateCalendar();
}
public void markDate(Date date) {
markedDates.add(date);
adapter.notifyDataSetChanged();
}
public void setOnDateClickListener(OnDateClickListener listener) {
this.onDateClickListener = listener;
}
private void updateCalendar() {
List<Date> dates = getDates();
adapter = new CalendarAdapter(context, dates, currentDate, markedDates);
gridView.setAdapter(adapter);
tvMonth.setText(dateFormat.format(currentDate.getTime()));
}
private List<Date> getDates() {
List<Date> dates = new ArrayList<>();
Calendar calendar = (Calendar) currentDate.clone();
calendar.set(Calendar.DAY_OF_MONTH, 1);
int firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
calendar.add(Calendar.DAY_OF_MONTH, -firstDayOfWeek);
while (dates.size() < 42) {
dates.add(calendar.getTime());
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
return dates;
}
public interface OnDateClickListener {
void onDateClick(Date date);
}
}
请注意,上述代码中添加了一个新的接口OnDateClickListener,用于处理日期点击事件。你可以在需要的地方实现该接口,并在回调方法onDateClick()中处理日期点击事件。
同时,也需要在calendar_item.xml布局文件中添加一个TextView来显示日期:
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_date"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="18sp" />
请确保在使用CalendarView时,将正确的布局文件calendar_item.xml和circle_background.xml作为背景样式文件。
非常抱歉给你带来了困扰,感谢你的耐心和理解。如果还有任何问题,请随时提问。
原文地址: http://www.cveoy.top/t/topic/bjS4 著作权归作者所有。请勿转载和采集!