当前位置: 首页 > 知识库问答 >
问题:

如何在android中使用recycler视图将事件放入日历中[duplicate]

公良子轩
2023-03-14

我正在使用JAVA创建一个android应用程序,在其中它将显示带有一些事件的日历。我在GridLayoutManager中的回收器视图的帮助下创建日历,并在java.time.LocalDate的帮助下解析日期。

我需要关于如何使用recycler视图在网格布局单元中显示事件的帮助。我不知道如何做到这一点,也不知道如何把这些活动放在回收者的视野中。我已经为adapter类、viewholder类、Calendar utils类和main activity类编写了代码。

适配器类:-


 private final ArrayList<LocalDate> daysOfMonth;
    private final OnItemListner onItemListner;

    public CalAdapter(ArrayList<LocalDate> daysOfMonth, OnItemListner onItemListner) {
        this.daysOfMonth = daysOfMonth;
        this.onItemListner = onItemListner;
    }

public CalViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.calendar_cell_hp, parent, false);
        ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
        layoutParams.height = (int) (parent.getHeight() * 0.166666666); //This will give the calendar cell hieght

        return new CalViewHolder(view, onItemListner);
    }

 public void onBindViewHolder(@NonNull CalViewHolder holder, int position) {

        //holder.dayOfMonth.setText(daysOfMonth.get(position));

        final LocalDate date = daysOfMonth.get(position);
        if (date == null)
            holder.dayOfMonth.setText("");
        else {
            holder.dayOfMonth.setText(String.valueOf(date.getDayOfMonth()));
            if (date.equals(CalendarUtils.selectedDate))          //this will display current date
               holder.parentView.setBackgroundColor(Color.BLUE); //this will display current date
            
        }


    }


public int getItemCount() {
        return daysOfMonth.size();
    }

//this will show the date on click
    public interface OnItemListner{
        void onItemClick(int position, String dayText);
    }

视图持有者类


class CalViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public final View parentView;
    public final TextView dayOfMonth;
    private final CalAdapter.OnItemListner onItemListner;

    public CalViewHolder(@NonNull View itemView, CalAdapter.OnItemListner onItemListner) {

        super(itemView);
        parentView = itemView.findViewById(R.id.parentView);
        dayOfMonth = itemView.findViewById(R.id.cellDayTextHP);
        this.onItemListner = onItemListner;
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        onItemListner.onItemClick(getAdapterPosition(), (String) dayOfMonth.getText());
    }
}

日历Utils类

public static LocalDate selectedDate;
 public static String monthYearFromDate(LocalDate date)
    {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM yyyy");
        return date.format(formatter);
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    public static ArrayList<LocalDate> daysInMonthArray(LocalDate date)
    {
        ArrayList<LocalDate> daysInMonthArray = new ArrayList<>();
        YearMonth yearMonth = YearMonth.from(date);

        int daysInMonth = yearMonth.lengthOfMonth();

        LocalDate firstOfMonth = CalendarUtils.selectedDate.withDayOfMonth(1);
        int dayOfWeek = firstOfMonth.getDayOfWeek().getValue();

        for(int i = 1; i <= 42; i++)
        {
            if(i <= dayOfWeek || i > daysInMonth + dayOfWeek)
                daysInMonthArray.add(null);
            else
                daysInMonthArray.add(LocalDate.of(selectedDate.getYear(),selectedDate.getMonth(),i - dayOfWeek));
        }
        return  daysInMonthArray;
    }

这里我有使用方法来设置月份视图MainActivity.java


private void setMonthView() {

        monthYearText.setText(monthYearFromDate(CalendarUtils.selectedDate));
        ArrayList<LocalDate> daysInMonth = daysInMonthArray(CalendarUtils.selectedDate);

        CalAdapter calAdapter = new CalAdapter(daysInMonth, this);
        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(), 7);
        calendarRecyclerView.setLayoutManager(layoutManager);
        calendarRecyclerView.setAdapter(calAdapter);

    }

我附上了两张图片:一张是我的输出,另一张是样本输出,即我想要实现的目标。

我已经厌倦了将活动的日期设定为2021年8月15日,即onBindViewHolder:-

String date1 = "14/07/2021";
        holder.event.setText("90% good"+date.format(DateTimeFormatter.ofPattern(date1)));

但得到的错误是:试图调用虚拟方法的java。字符串java。时间LocalDate。格式化(java.time.format.DateTimeFormatter)在空对象引用上

我真的需要帮助请...

共有1个答案

郝昊东
2023-03-14

您可以自定义视图持有人布局以显示事件。如果那天有任何事件,显示它,否则,设置为事件视图可见性。

为此,您可以传递包含日期和事件的自定义类的ArrayList,例如MyDate的ArrayList,而不是将LocalDate的ArrayList传递给适配器:

   class MyDate {
        LocalDate date;
        MyEvent event;
    }

    class MyEvent {
        String title;
        ...
    }

MyDate类应该从数据库或任何其他方式填充。

在onbindview中,用户可以使用它来显示事件:

    ArrayList<MyDate> myDates; // instead of  ArrayList<LocalDate> daysOfMonth;

    public void onBindViewHolder(@NonNull CalViewHolder holder, int position) {
        final MyDate myDate = myDates.get(position);
        if (myDate == null) {
            holder.dayOfMonth.setText("");
            holder.eventTextView.setText("");
        } else {

            // set date
            holder.dayOfMonth.setText(String.valueOf(myDate.date.getDayOfMonth()));

            //set background color
            if (myDate.date.equals(CalendarUtils.selectedDate)) {
                holder.parentView.setBackgroundColor(Color.BLUE);
            }

            //set event
            if (myDate.event != null) {
                holder.eventTextView.setText(myDate.event.title);
                holder.eventTextView.setVisibility(View.VISIBLE);
            } else {
                holder.eventTextView.setVisibility(View.GONE);
            }
        }
    }
 类似资料:
  • 我正在构建一个简单的日程表应用程序,并使用日历视图添加了一个日历。我想在一些特定的日期中添加事件作为假日,并用红色标记它们(只是日期是红色的)。每个星期六和星期天都会是红色的,其他日子也会是红色的。所以,基本上我要问的是,如何制作一个只有开发者才能更改的事件日历。我是android studio的初学者,请尝试用最简单的方式回答。

  • 我想显示一个日历,其中包含在日期上使用不同颜色的事件,类似于默认日历应用程序。但是我在默认日历视图中没有看到任何这样的API。 有人能告诉我正确的方向吗?如何进行?我应该扩展默认日历并添加自己的功能吗?或者我应该使用带有PageViewer和片段的5x5文本框吗?

  • 我在我的项目中实现了一个calendarview,我可以获取月份、月份和年份,但我找不到任何方法来获取星期几,我的代码是这样的: 当我在日历中选择一天时,我需要得到一周的时间,我试图得到答案,但我找不到。 对不起我的英语。

  • 我需要一个Android日历视图像附上的照片。我已经尝试使用这个库https://github.com/alamkanak/android-week-view作为日历视图。这是一个固定的静态事件在日历添加仅。无法在此库日历视图中添加动态事件。有没有人可以推荐任何一个自定义库在Android。 日历视图库代码示例Android-Week-View: 我在这个图书馆所尝试的: 注: 我需要在此日历视图

  • 我用的是完整的日历。这里我的问题是在点击prev按钮或next按钮点击功能时,如何在月视图、周视图或日视图中找到fullcalendar is的格式。这里正在为next和prev按钮调用自定义代码。因为我想用它激发一些自定义数据。基于fullcalendar视图。 在这里我想找到完整日历的视图,以月、周或日为单位 在这里我想找到完整日历的视图,以月、周或日为单位

  • 在最近的谷歌日历应用程序中,它有一个日历,可以下拉显示,并以如下方式显示: 我想建立一个日历这样的应用程序,但当我把android API的应用程序,它的风格是非常不同的: 所以,问题是我如何才能样式/自定义日历视图像谷歌日历应用程序中的一个? 此外,对于谷歌日历应用程序的日历,当颗粒物上出现事件时,日期文本下会出现“小点”(如上面谷歌日历图像中的8月19日和21日)。当我有一个日期列表(不是An