0

我正在创建一个日历应用程序,每个月都使用 RecyclerView 显示。在每个月的每一天,都有另一个 RecyclerView 来显示当天的事件。我正在使用https://stackoverflow.com/a/38513905/13199395中的 custuomLinearLayoutManager ,并且查看了很多示例。我的嵌套代码与它们非常相似,但由于某种原因无法正常工作。任何关于为什么不起作用的帮助将不胜感激。

月视图:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MonthViewActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/calView"
        android:layout_width="match_parent"
        android:layout_height="581dp"

        android:layout_gravity="bottom" />
</FrameLayout>

每天的视图:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dayView"
    android:layout_width="145px"
    android:layout_height="265px"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/eventDayView"
        android:layout_width="wrap_content"

        android:layout_height="wrap_content">

    </androidx.recyclerview.widget.RecyclerView>
</LinearLayout>

以及内部 recyclerView 的视图:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/showEvents"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/eventName"
        android:layout_width="145px"
        android:layout_height="wrap_content" />

</LinearLayout>

主recyclerview的适配器:

public class MonthViewAdapter extends RecyclerView.Adapter<MonthViewAdapter.ViewHolder>  {

    Context context;
    ArrayList<Day> days;

    CustomLinearLayoutManager l;

    public MonthViewAdapter(Context context, ArrayList<Day> arrayList) {

        this.context = context;
        this.days = arrayList;
    }

    @NonNull
    @Override
    public MonthViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.content_events, parent, false);
        return new ViewHolder(view, this.mOnDayClickListener);
    }

    @Override
    public void onBindViewHolder(MonthViewAdapter.ViewHolder holder, int position) {

        l = new CustomLinearLayoutManager(context, LinearLayout.VERTICAL, false);
        ViewGroup.LayoutParams params=holder.r.getLayoutParams();
        params.height=100;
        holder.r.setLayoutParams(params);
        holder.r.setLayoutManager(l);
        EventViewAdapter adapter = new EventViewAdapter(context, days.get(position).getEvents(), this.mOnDayClickListener);

        holder.r.setAdapter(adapter);
        holder.t.setText(days.get(position).getMonthDayNumber());

    }

    @Override
    public int getItemCount() {
        return days.size();
    }
    public class ViewHolder extends RecyclerView.ViewHolder  {
        RecyclerView r;
        TextView t;
        FrameLayout f;
        LinearLayout l;

        public ViewHolder(View itemView) {
            super(itemView);
            l = itemView.findViewById(R.id.dayView);
            t = itemView.findViewById(R.id.dayNum);
            r  = itemView.findViewById(R.id.eventDayView);


        } 
    }
}

内部 RecyclerView 的适配器:

public class EventViewAdapter extends RecyclerView.Adapter<EventViewAdapter.ViewHolder> {

    Context context;
    ArrayList<Event> events;


    public EventViewAdapter (Context context, ArrayList<Event> arrayList) {
        this.context = context;
        this.events = arrayList;

    }

    @Override
    public EventViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.content_single_event, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(EventViewAdapter.ViewHolder holder, int position) {
        Log.d("event", Integer.toString(events.size()));
        holder.eventName.setText(events.get(position).getName());

    }

    @Override
    public int getItemCount() {
        return events.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView eventName;

        LinearLayout linearLayout;

        public ViewHolder(View itemView) {
            super(itemView);
            eventName = itemView.findViewById(R.id.eventName);
            linearLayout = itemView.findViewById(R.id.showEvents);

        }
    }
}

自定义线性布局管理器:https ://stackoverflow.com/a/38513905/13199395

和活动

public class MonthViewActivity extends AppCompatActivity{

        RecyclerView month;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_month_view);

            month.setHasFixedSize(true);
            month.addItemDecoration(new DividerItemDecoration(this,
                    DividerItemDecoration.HORIZONTAL));
            month.addItemDecoration(new DividerItemDecoration(this,
                    DividerItemDecoration.VERTICAL));

            GridLayoutManager g = new GridLayoutManager(this, 7);

            month.setLayoutManager(g);

            ArrayList<Day> day = new ArrayList<>();
            LocalDate dd = LocalDate.now();
            Day d1 = new Day(dd);
            Day d2 = new Day(dd.plusDays(1));
            Day d3 = new Day(dd.plusDays(2));
            d1.addEvent(new Event("a"));
            day.add(d1);
            adapter = new MonthViewAdapter(this, day, this);
            month.setAdapter(adapter);
        }
    }

我传递给月视图适配器的列表中的每个元素都有一个事件列表,然后将这些事件列表传递给事件适配器。但是,网格中的每一天只显示一个事件,它不会显示每天事件列表中的所有事件。为什么会发生这种情况,我该如何解决?我收到一个错误(java.lang.IndexOutOfBoundsException:无效的项目位置)

View view = recycler.getViewForPosition(position);

在自定义布局管理器中,但程序不会崩溃。

4

0 回答 0