有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在MaterialCalendarView中显示特定日期和时间的事件?

我正在测试一个示例应用程序,试图实现显示特定日期的时间和日期。目前,它只绘制整个月,即使事件持续一天。比如说,如果事件发生在1月5日上午9:30到10:30之间,那么它将出现整个月,而不仅仅是1月5日。想要实现这样的目标:

enter image description here

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

enter image description here

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

唯一不同的是日历上的位置。xml类I在<com.prolificinteractive.materialcalendarview.MaterialCalendarView下添加了:app:mcv_showOtherDates="all"以显示每周视图。 还有,在日历片段中。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 class i testjson.json,包含在项目资产文件夹中)

谢谢


共 (1) 个答案

  1. # 1 楼答案

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

    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();
            }
        }
    
    }