【问题标题】:How do I display events to a specific date and time in a MaterialCalendarView?如何在 MaterialCalendarView 中显示特定日期和时间的事件?
【发布时间】:2020-04-22 18:50:05
【问题描述】:

我正在测试一个示例应用程序,我试图在其中显示特定日期的时间和日期。目前,即使事件是一天,它也只是绘制到整个月。假设如果该事件是在 1 月 5 日上午 9:30 到上午 10:30,它将显示整个月,而不仅仅是 1 月 5 日。想要实现这样的目标:

目前我的应用程序会在整个月内显示它,即使它是 1 月 1 日或 1 月 8 日的事件(例如,这是一个屏幕截图,它错误地显示在 1 月 15 日那一周,即使这 2 个事件属于 2 个不同的日期):

我正在测试的代码在这里:https://github.com/raghunandankavi2010/SamplesAndroid/tree/master/CalendarTest

我在 calendar.xml 类中添加的唯一区别是:app:mcv_showOtherDates="all"<com.prolificinteractive.materialcalendarview.MaterialCalendarView 下显示每周视图。 此外,在 calendarFragment.java 类中有一个名为 makeJsonObjectRequest 的函数,其中解析了 StartDate,我尝试解析 startTime StartTime 和 EndTime 以及 EndDate 以将事件分别映射到日期,但这并没有做太多。

 String EndDate = jsonObject.getString("EndTime");
                Date date = simpleDateFormat.parse(EndDate);

                String title =  jsonObject.getString("Title");

                Log.d("EndDate ",""+date);
                CalendarDay day = CalendarDay.from(date);
                Event event = new Event(date,title);
                cal = Calendar.getInstance();
                cal.setTime(date);
                int month = cal.get(Calendar.DAY_OF_THE_MONTH); 

知道如何解决这个问题并更新代码,这样我就可以在特定时间范围内显示该月的某一天的事件(如上面的 Outlook 屏幕截图(第一个屏幕截图)所示),而不是整个月? (另外,json 类我 testjson.json 并包含在项目资产文件夹中)

谢谢!

【问题讨论】:

    标签: java android material-design android-calendar android-json


    【解决方案1】:

    repo 中的示例使用月份过滤事件。您需要按日历日过滤事件并更新onDateSelected 中的列表视图,以便在用户选择不同日期时更新列表视图。你应该得到这样的东西:

    public class CalendarFragment extends Fragment implements OnDateSelectedListener {
    
    
        private MaterialCalendarView calendarView;
        private HashMap<CalendarDay,List<Event>> map = new HashMap<>();
        private ListView listView;
        private MyAdapter adapter;
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
            View view = inflater.inflate(R.layout.calendar, container, false);
    
            listView = view.findViewById(R.id.listview);
    
            adapter = new MyAdapter(getActivity(),new ArrayList<Event>());
            listView.setAdapter(adapter);
    
            calendarView =  view.findViewById(R.id.calendarView);
            calendarView.setDateTextAppearance(View.ACCESSIBILITY_LIVE_REGION_ASSERTIVE);
    
            calendarView.setSelectedDate(LocalDate.now());
    
            calendarView.setOnDateChangedListener(this);
    
            makeJsonObjectRequest();
    
            return view;
        }
    
    
    
    
        private void makeJsonObjectRequest() {
    
            String response = loadJSONFromAsset();
            try {
                JSONArray jArray = new JSONArray(response);
                for (int i = 0; i < jArray.length(); i++) {
                    JSONObject jsonObject = jArray.getJSONObject(i);
                    String StartDate = jsonObject.getString("StartDate");
                    LocalDate date = LocalDate.parse(StartDate, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss",Locale.US));
    
                    String title =  jsonObject.getString("Title");
    
                    Log.d("Date ",""+date);
                    CalendarDay day = CalendarDay.from(date);
                    Event event = new Event(date,title);
    
    
                    if(!map.containsKey(day))
                    {
                        List<Event> events = new ArrayList<>();
                        events.add(event);
                        map.put(day,events);
                    }else
                    {
                        List<Event> events = map.get(day);
                        events.add(event);
                        map.put(day,events);
    
                    }
    
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            // after parsing
            List<Event> event =  map.get(CalendarDay.from(LocalDate.now()));
            if(event!=null && event.size()>0) {
                adapter.addItems(event);
            }else {
                adapter.clear();
            }
    
            //add small dots on event days
            EventDecorator eventDecorator = new EventDecorator(Color.RED, map.keySet());
            calendarView.addDecorator(eventDecorator);
    
    
        }
    
        public String loadJSONFromAsset() {
            String json = null;
            try {
                InputStream is = getActivity().getAssets().open("testjson.json");
                int size = is.available();
                byte[] buffer = new byte[size];
                is.read(buffer);
                is.close();
                json = new String(buffer, "UTF-8");
            } catch (IOException ex) {
                ex.printStackTrace();
                return null;
            }
            return json;
        }
    
        @Override
        public void onDateSelected(@NonNull MaterialCalendarView widget, @NonNull CalendarDay date, boolean selected) {
    
            calendarView.setHeaderTextAppearance(R.style.AppTheme);
    
            List<Event> event =  map.get(date);
            if(event!=null && event.size()>0) {
                adapter.addItems(event);
            }else {
                adapter.clear();
            }
        }
    
    }
    

    【讨论】:

    • 感谢您发布此内容 :) 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多