是否可以自定义 CalendarView 小部件以显示事件并自定义颜色(渐变色)?

Is it possible to customize the CalendarView widget to display events and customize the colour (Gradient colour)?

我目前正在开发一个应用程序,但我一直在实施该应用程序的日历部分。现在我正在尝试实现与此类似的东西:

我在原始日历视图上没有找到任何功能可以让我在天数下显示事件指示器、添加渐变颜色而不是纯色等。 我想在我的应用程序中实施此设计:

我尝试使用 SundeepK 的 Compact Calendar View 但是我没有设法实现一个事件适配器来配合这个日历,我总是在传递上下文时收到错误,因为自定义日历不使用上下文。

下面的这段代码我试图实现列表视图以填充当月的事件。因此,在每月加载或滚动时,事件将被加载并传递给适配器,列表视图将填充新事件。但是,无论我做什么,我总是遇到无法将 android.Context 转换为自定义日历上下文的错误。

CalendarActivity.java

        compactCalendarView.setListener(new CompactCalendarView.CompactCalendarViewListener() {
            @Override
            public void onDayClick(Date dateClicked) {
                List<Event> bookingsFromMap = compactCalendarView.getEvents(dateClicked);
                EventListAdapter adapter = new EventListAdapter(context, bookingsFromMap);

                ListView listView = (ListView) findViewById(R.id.calendar_event_list);
                listView.setAdapter(adapter);

                Log.d(TAG, "inside onclick " + simple_date_format.format(dateClicked));
                if (bookingsFromMap != null) {
                    Log.d(TAG, bookingsFromMap.toString());
                    mutableBookings.clear();
                    for (Event booking : bookingsFromMap) {
                        mutableBookings.add((String) booking.getData());
                        Log.d(TAG, "Events in this day found!");
                        }
                } else {
                    Log.println(Log.VERBOSE,TAG, "\n NO EVENTS FOUND \n");
                }
            }

EventListAdapter.java

public class EventListAdapter extends ArrayAdapter<Event> {

    public EventListAdapter(Context context, List<Event> feeds) {
        super(context,0,feeds);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Event feed = getItem(position);
        if(convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.event_feed_item_row, parent, false);
        }

        TextView eventName = (TextView) convertView.findViewById(R.id.event_list_dataText);
        TextView eventDay = (TextView) convertView.findViewById(R.id.event_list_dayTextView);
        TextView eventMonth = (TextView) convertView.findViewById(R.id.event_list_monthTextView);

        SimpleDateFormat simple_month = new SimpleDateFormat("Mmm", Locale.US);
        SimpleDateFormat simple_day = new SimpleDateFormat("dd", Locale.US);
        eventName.setText((String) feed.getData());
        eventMonth.setText(simple_month.format(feed.getTimeInMillis()));
        eventDay.setText(simple_day.format(feed.getTimeInMillis()));

        return convertView;
    }
}

现在从这里的屏幕截图来看:

日历背景只能是纯色当我想有一个渐变作为背景时,就像选择日期一样是纯色。

事件列表项如下所示(试图找到一种按月动态添加事件的方法):

理想的版本应该是这样的:

如有任何建议,我们将不胜感激。

要以简单快捷的方式做到这一点,您只需要遵循这个 git 中心库,它有很多选项可以执行您需要的功能。

Link (https://github.com/mahimrocky/EventCalender)

底部也将使用数据库在 Recyler 视图中创建

我找到了一个项目,可以根据您的要求稍微修改一下来创建日历

使用这个:Sample Project

您首先需要为日历制作渐变背景只需要将res/fraglay.xml渐变可绘制资源设置为根布局背景

您的第二个需要是通过修改 drawable/selectedback.xml 文件

来制作选定的日期渐变背景

你的第三个需求是底部回收器如果你想根据你的要求修改事件名称布局编辑layout/view_item它已经在上面的项目中可用

在上面的项目中,您可以通过 GooglecalenderView 的 init 方法设置事件,如果一个日期多个事件可用,您可以设置任何您想要的事件,在这种情况下也可以正常工作

在使用 CompactCalendarView 时,您可以将事件添加到日历中,然后单击即可获取所选日期的事件您可以使用此代码来实现 ..

Long miliseconds = GettingMiliSeconds(formatteddate);


  Event newevent = AddEvents(miliseconds, "" + "Text You wants to add in your event ");

                        calendarView.addEvent(newevent);



 public Event AddEvents(Long milliseconds,String Description)
    {
        Event  event  = new Event(Color.BLUE,milliseconds,""+Description);

        return  event;
    }

    public Long GettingMiliSeconds(String Date)
    {
        long timeInMilliseconds = 0;

        SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
        try {

            Date mDate = sdf.parse(Date);
            timeInMilliseconds = mDate.getTime();

        } catch (ParseException  e) {
            e.printStackTrace();
        }

        return  timeInMilliseconds;
    }