parent
ab99608b4f
commit
0f02fe64b4
@ -0,0 +1,158 @@
|
||||
package com.example.doitnow;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.example.doitnow.Adapter.ToDoAdapter;
|
||||
import com.example.doitnow.Model.ToDoModel;
|
||||
import com.example.doitnow.Utils.DatabaseHandler;
|
||||
import com.prolificinteractive.materialcalendarview.CalendarDay;
|
||||
import com.prolificinteractive.materialcalendarview.MaterialCalendarView;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
public class CalendarFragment extends Fragment {
|
||||
|
||||
private MaterialCalendarView calendarView;
|
||||
private RecyclerView todoRecyclerView;
|
||||
private ToDoAdapter tasksAdapter;
|
||||
private List<ToDoModel> taskList;
|
||||
private DatabaseHandler db;
|
||||
private TextView noTaskText;
|
||||
private TextView currentDateText;
|
||||
|
||||
private boolean isCalendarCollapsed = false;
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater,
|
||||
@Nullable ViewGroup container,
|
||||
@Nullable Bundle savedInstanceState) {
|
||||
|
||||
View view = inflater.inflate(R.layout.fragment_calendar, container, false);
|
||||
|
||||
calendarView = view.findViewById(R.id.calendarView);
|
||||
todoRecyclerView = view.findViewById(R.id.todoRecyclerView);
|
||||
noTaskText = view.findViewById(R.id.noTaskText);
|
||||
currentDateText = view.findViewById(R.id.currentDateText);
|
||||
|
||||
db = new DatabaseHandler(requireContext());
|
||||
db.openDatabase();
|
||||
|
||||
taskList = Collections.emptyList();
|
||||
todoRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||
tasksAdapter = new ToDoAdapter(db, requireActivity(), taskList);
|
||||
todoRecyclerView.setAdapter(tasksAdapter);
|
||||
|
||||
// 設置預設選中今天
|
||||
calendarView.setSelectedDate(CalendarDay.today());
|
||||
updateTasksForDate(new Date());
|
||||
|
||||
// 點選日曆日期時折疊日曆
|
||||
calendarView.setOnDateChangedListener((widget, date, selected) -> {
|
||||
Date selectedDate = date.getDate();
|
||||
updateTasksForDate(selectedDate);
|
||||
|
||||
currentDateText.setText(formatDate(selectedDate));
|
||||
currentDateText.setVisibility(View.VISIBLE);
|
||||
|
||||
// 動畫折疊日曆
|
||||
calendarView.animate()
|
||||
.translationY(-calendarView.getHeight())
|
||||
.alpha(0f)
|
||||
.setDuration(300)
|
||||
.withEndAction(() -> {
|
||||
calendarView.setVisibility(View.GONE);
|
||||
calendarView.setTranslationY(0); // 重置位置
|
||||
calendarView.setAlpha(1f);
|
||||
});
|
||||
|
||||
isCalendarCollapsed = true;
|
||||
});
|
||||
|
||||
// 點選頂部日期欄時展開日曆
|
||||
currentDateText.setOnClickListener(v -> {
|
||||
if (isCalendarCollapsed) {
|
||||
calendarView.setVisibility(View.VISIBLE);
|
||||
calendarView.setAlpha(0f);
|
||||
calendarView.setTranslationY(-calendarView.getHeight());
|
||||
|
||||
// 動畫展開日曆
|
||||
calendarView.animate()
|
||||
.translationY(0)
|
||||
.alpha(1f)
|
||||
.setDuration(300)
|
||||
.start();
|
||||
|
||||
currentDateText.setVisibility(View.GONE);
|
||||
isCalendarCollapsed = false;
|
||||
}
|
||||
});
|
||||
|
||||
addEventDots();
|
||||
|
||||
calendarView.setOnMonthChangedListener((widget, date) -> {
|
||||
calendarView.removeDecorators();
|
||||
addEventDots();
|
||||
});
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
private void updateTasksForDate(Date date) {
|
||||
String clickedDate = formatDate(date);
|
||||
List<ToDoModel> tasks = db.getTasksByDate(clickedDate);
|
||||
|
||||
if (tasks.isEmpty()) {
|
||||
noTaskText.setVisibility(View.VISIBLE);
|
||||
todoRecyclerView.setVisibility(View.GONE);
|
||||
} else {
|
||||
noTaskText.setVisibility(View.GONE);
|
||||
todoRecyclerView.setVisibility(View.VISIBLE);
|
||||
tasksAdapter.setTasks(tasks);
|
||||
}
|
||||
}
|
||||
|
||||
private String formatDate(Date date) {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
|
||||
return sdf.format(date);
|
||||
}
|
||||
|
||||
private void addEventDots() {
|
||||
List<ToDoModel> allTasks = db.getAllTasks();
|
||||
HashSet<CalendarDay> eventDates = new HashSet<>();
|
||||
|
||||
CalendarDay currentMonth = calendarView.getCurrentDate();
|
||||
|
||||
for (ToDoModel task : allTasks) {
|
||||
try {
|
||||
String dateStr = task.getEndTime();
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
|
||||
Date date = sdf.parse(dateStr);
|
||||
CalendarDay day = CalendarDay.from(date);
|
||||
if (day.getMonth() == currentMonth.getMonth() && day.getYear() == currentMonth.getYear()) {
|
||||
eventDates.add(day);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
calendarView.addDecorator(new EventDecorator(Color.parseColor("#8E24AA"), eventDates));
|
||||
}
|
||||
}
|
Loading…
Reference in new issue