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

时间:2019-07-18 02:13:46

标签: android android-studio android-studio-3.0 calendarview

我目前正在开发一个应用程序,但我坚持执行该应用程序的日历部分。现在,我正在尝试实现类似于以下的功能:

我没有在原始日历视图上找到任何功能,该功能可以让我在几天内显示事件指示器,添加渐变色而不是纯色等。 我想在我的应用程序中实现这种设计:

enter image description here

我尝试使用SundeepK的Compact Calendar View,但是我没有设法实现与该日历一起使用的事件适配器,由于自定义日历未使用上下文,因此在传递上下文时总是会收到错误消息。

下面的这段代码我试图实现List视图,以填充当月的事件。因此,在按月加载或滚动浏览时,将加载事件,将事件传递给适配器,并且列表视图将充满新事件。但是,无论我做什么,总是会遇到无法将android.Context转换为自定义日历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;
    }
}

现在从此处的屏幕截图中获取

只有当我想使用渐变作为背景时,日历背景才能是纯色,就像所选日期是纯色一样。 enter image description here

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

理想版本应如下所示: enter image description here

任何建议将不胜感激。

3 个答案:

答案 0 :(得分:1)

要轻松,快速地做到这一点,您只需遵循此git hub库,这是执行所需功能的很多选择。

链接(https://github.com/mahimrocky/EventCalender

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

答案 1 :(得分:0)

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

使用此命令:Sample Project

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

您的第二个需要是通过修改drawable / selectedback.xml文件来选择日期渐变背景

您的第三个需求是底部recyclerview,如果您要根据需要修改事件名称布局,编辑布局/ view_item,则该项目已在上述项目中提供

在上述项目中,您可以通过GooglecalenderView的init方法设置事件,如果可以使用一个日期多个事件,则可以设置所需的任何事件,

答案 2 :(得分:0)

使用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;
    }