Android: Календарь с событиями

У меня есть проблема с календарем в android. Я хочу добавить события, которые находятся в базе данных. В основном я хочу, когда я открою свой календарный фрагмент, он вызовет веб-службу и извлечет данные с сервера, который включает даты и их соответствующие события, когда я нажимаю на эту дату в календаре, он показывает мне события в указанную дату. Вопросы, с которыми я столкнулся:

  • Он показывает некоторую ошибку в этой строке date = sdf.parse(dates); и говорит

    java.lang.NullPointerException
       at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1009)
       at java.text.DateFormat.parse(DateFormat.java:553)
       at com.example.aksystems.practiceportal.Calendar.showJSON(Calendar.java:118)
    
  • За два дня до успешного запуска, и проблема в том, что он будет генерировать точку в календарный день дважды. Пример: ответ моего сервера

    [{"d":"a","events":"2017\/04\/13 18:20:43"},{"d":"a","events":"2017\/04\/10 18:20:40"}]`
    

    поэтому он будет указывать дату 13 один раз и дата 10 столько раз, почему?

Calendar.java

public class Calendar extends Fragment {

    CalendarView calendarView;

    private EditText editTextId;
    private Button buttonGet;
    private TextView textViewResult;
    String dates,events;
    private ProgressDialog loading;
    CompactCalendarView compactCalendarView;
    String id = "a";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    Date date = null;
    public Calendar() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_layout_calendar, container, false);

        compactCalendarView = (CompactCalendarView) view.findViewById(R.id.compactcalendar_view);

        editTextId = (EditText) view.findViewById(R.id.editTextId);
        buttonGet = (Button)view. findViewById(R.id.buttonGet);
        textViewResult = (TextView) view.findViewById(R.id.textViewResult);
        getData();

        return view;

    }
    private void getData() {


        loading = ProgressDialog.show(getActivity(),"Please wait...","Fetching...",false,false);

        String url = Config.DATA_URL+"?e="+id;

        StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>()
        {
            @Override
            public void onResponse(String response) {
                loading.dismiss();
                showJSON(response);
            }
        },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(getActivity(),error.getMessage().toString(),Toast.LENGTH_LONG).show();
                    }
                });

        RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
        requestQueue.add(stringRequest);
    }

    private void showJSON(String response)
    {

        for (int i=0;i < response.length();i++)

        {
            try {

                JSONObject jsonObject = new JSONObject(response);
                JSONArray result = jsonObject.getJSONArray(Config.JSON_ARRAY);
                JSONObject collegeData = result.getJSONObject(i);
                dates = collegeData.getString(Config.KEY_DATES);
                events = collegeData.getString(Config.KEY_EVENTS);
                //vc = collegeData.getString(Config.KEY_VC);*/

            } catch (JSONException e) {
                e.printStackTrace();
            }
            // textViewResult.setText(""+dates);

            // String myDate = "2017/03/30 18:10:45";

            try
            {
                date = sdf.parse(dates);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            // Convert Date into milliseconds
            assert date != null;
            long millis = date.getTime();

            Event ev1 = new Event(Color.RED, millis, events);
            compactCalendarView.addEvent(ev1);
           /* List<Event> events = compactCalendarView.getEvents(millis);
            Toast.makeText(getActivity(), "" + events, Toast.LENGTH_SHORT).show();*/
            compactCalendarView.setListener(new CompactCalendarView.CompactCalendarViewListener()
            {
                @Override
                public void onDayClick(Date dateClicked) {
                    List<Event> events = compactCalendarView.getEvents(dateClicked);

                    // Log.d(TAG, "Day was clicked: " + dateClicked + " with events " + events);
                    Toast.makeText(getActivity(), "" + events, Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onMonthScroll(Date firstDayOfNewMonth)
                {
                    //  Log.d(TAG, "Month was scrolled to: " + firstDayOfNewMonth);
                   // Toast.makeText(getActivity(), "Month was scrolled to: " + firstDayOfNewMonth, Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
}

Ответ 1

  • Это потому, что прошедшая дата не в текущем формате. См. Ваш PHP script.
  • Ваш varible response.length() возвращает значение больше двух, поэтому он укажет на несколько событий в последнюю дату. Попробуйте использовать JSONArray.size(), чтобы найти длину ответа.