Вложенные RecyclerViews - PullRequest
       40

Вложенные RecyclerViews

0 голосов
/ 08 апреля 2020

Я создаю приложение календаря, каждый месяц отображается с помощью RecylcerView. Внутри каждого дня каждого месяца есть другой RecyclerView для отображения событий в этот день. Я использую 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>

и представление для внутреннего переработчикаПросмотр:

    <?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>

Адаптер для основного переработчикаПросмотр:

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

        }
    }
}

Настраиваемая линейная компоновка менеджер: { ссылка }

И действие

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

в диспетчере пользовательских макетов, но программа не обрабатывает sh.

...