And*_*Dev 10 java android calendar
我的目标是找到一个Android库,允许我根据数组在日历视图上标记各种日期.日期可能是也可能不是连续的.我理想的情况是改变每个日期的背景颜色.重要的复杂性是我在运行时之前不知道这种颜色,因为它将来自服务器查询.
我整天都在研究这个问题,而我最大的希望似乎是material-calendarview(github).但是,我发现他们的代码有点难以理解,这在我身上,但我完全陷入困境.
我在XML布局中添加了这样的日历:
<com.prolificinteractive.materialcalendarview.MaterialCalendarView
android:id="@+id/calendar_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:mcv_showOtherDates="all"
app:mcv_selectionColor="#00F"/>
Run Code Online (Sandbox Code Playgroud)
然后在我的活动中,我有这些实例变量:
private MaterialCalendarView calendarView;
private ArrayList<Date> markedDates;
Run Code Online (Sandbox Code Playgroud)
这个代码在我的 onCreateView()
calendarView = (MaterialCalendarView) view.findViewById(R.id.calendar_view);
Run Code Online (Sandbox Code Playgroud)
好的,够容易的.但我无法弄清楚如何从我的日期数组中标记日历.我正在研究这种方法,但我不知道如何超越我的方法:
private void initializeCalendar() {
calendarView.setOnDateChangedListener(context);
calendarView.setShowOtherDates(MaterialCalendarView.SHOW_ALL);
Calendar calendar = Calendar.getInstance();
calendarView.setSelectedDate(calendar.getTime());
calendar.set(calendar.get(Calendar.YEAR), Calendar.JANUARY, 1);
calendarView.setMinimumDate(calendar.getTime());
calendar.set(calendar.get(Calendar.YEAR), Calendar.DECEMBER, 31);
calendarView.setMaximumDate(calendar.getTime());
int bgColor = sharedVisualElements.getPrimaryColor();
calendarView.addDecorators(new EventDecorator(bgColor, ????));
}
Run Code Online (Sandbox Code Playgroud)
最后一行是指这个内部类:
private class EventDecorator implements DayViewDecorator {
private final int color;
private final HashSet<CalendarDay> dates;
public EventDecorator(int color, Collection<CalendarDay> dates) {
this.color = color;
this.dates = new HashSet<>(dates);
}
@Override
public boolean shouldDecorate(CalendarDay day) {
return dates.contains(day);
}
@Override
public void decorate(DayViewFacade view) {
view.addSpan(new DotSpan(5, color));
}
}
Run Code Online (Sandbox Code Playgroud)
我认为我的挑战是将我转变ArrayList<Date> markedDates为他们所称的Collection<CalendarDay> dates.同意?但这是我真正陷入困境的地方.这个数据结构对我来说很奇怪.当我尝试通过调用new CalendarDay()我的类来实例化它时,立即使用大约10种新方法进行扩展,这些方法我不理解它们的作用或者如何处理它们.很明显,我要离开这里了.这不是一件容易的事.
有没有人为此目的使用此库并知道如何完成此任务?我停顿了一下.此外,如果有一个更简单的库允许我使用仅在运行时已知的颜色设置背景颜色,我会全神贯注.
谢谢你的帮助.我担心我以一种令人困惑的方式写这个,这是因为我完全困惑.
我解决了这个问题,所以我会发布该解决方案,以防其他人有同样的问题。如果有更有效的方法,请发布作为解决方案。
我提到我有一个包含日期列表的数组。我需要做的是迭代该数组,将每个数组转换Date为Calendar设置为适当的年、月和日的对象,然后将该对象添加到不同的ArrayList,这次是ArrayList<CalendarDay>. 例如:
List<CalendarDay> list = new ArrayList<CalendarDay>();
Calendar calendar = Calendar.getInstance();
for (Date date : markedDates) {
// might be a more elegant way to do this part, but this is very explicit
int year = date.getYear();
int month = date.getMonthOfYear() - 1; // months are 0-based in Calendar
int day = date.getDayOfMonth();
calendar.set(year, month, day);
CalendarDay calendarDay = CalendarDay.from(calendar);
list.add(calendarDay);
}
Run Code Online (Sandbox Code Playgroud)
现在我们已经有了这个CalendarDay对象列表,但还没有完全实现。创建数据结构的最后一步是将其“转换”为我提到的我在OP中遇到的问题——一个Collection<CalendarDay>结构。事实证明,一旦我们到达这里,事情就再简单不过了。只需像这样分配它:
calendarDays = list;
Run Code Online (Sandbox Code Playgroud)
然后当你想添加装饰器时,一切就都准备好了。只需这样做:
calendarView.addDecorators(new EventDecorator(myColor, calendarDays));
Run Code Online (Sandbox Code Playgroud)
还有一件事值得一提,这是我困惑的一个主要原因。我不明白如何实例化这个Collection<CalendarDay>对象。在实例变量部分(构造函数之前),我添加了以下代码,几乎所有代码都由 Android Studio 帮我填充:
private Collection<CalendarDay> calendarDays = new Collection<CalendarDay>() {
@Override
public boolean add(CalendarDay object) {
return false;
}
@Override
public boolean addAll(Collection<? extends CalendarDay> collection) {
return false;
}
@Override
public void clear() {
}
@Override
public boolean contains(Object object) {
return false;
}
@Override
public boolean containsAll(Collection<?> collection) {
return false;
}
@Override
public boolean isEmpty() {
return false;
}
@NonNull
@Override
public Iterator<CalendarDay> iterator() {
return null;
}
@Override
public boolean remove(Object object) {
return false;
}
@Override
public boolean removeAll(Collection<?> collection) {
return false;
}
@Override
public boolean retainAll(Collection<?> collection) {
return false;
}
@Override
public int size() {
return 0;
}
@NonNull
@Override
public Object[] toArray() {
return new Object[0];
}
@NonNull
@Override
public <T> T[] toArray(T[] array) {
return null;
}
};
Run Code Online (Sandbox Code Playgroud)
我希望这对某人有帮助。再次强调,如果有更好的解决方案,请发布,我会删除我的。
| 归档时间: |
|
| 查看次数: |
11873 次 |
| 最近记录: |