RecyclerView - динамическая высота без смещающихся элементов - PullRequest
0 голосов
/ 19 мая 2018

Что мне нужно:

here

Я пытался сделать это, используя RecyclerView, который динамически устанавливает высоту элемента на основе модели.Я использую

Макет:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    card_view:cardUseCompatPadding="true">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/white"
    android:orientation="vertical"
    android:gravity="center|bottom"
    android:layout_weight="0">

    <TextView
        android:id="@+id/teacher"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:padding="5dp"
        android:textColor="@android:color/black"
        android:textSize="16sp" />
    <TextView
        android:id="@+id/room"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/teacher"
        android:padding="5dp"
        android:textColor="@android:color/black"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/subject"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#1976D2"
        android:gravity="center_horizontal"
        android:layout_alignParentBottom="true"
        android:paddingBottom="8dp"
        android:paddingTop="8dp"
        android:textColor="#ffffff"
        android:textSize="13sp"
        android:maxLines="3"
        android:lines="1" />
</RelativeLayout>

</android.support.v7.widget.CardView>

Код адаптера:

  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SampleViewHolders {
    val layoutView = LayoutInflater.from(parent.context).inflate(
            R.layout.rv_grid, null)
    layoutView.getViewTreeObserver().addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
        override fun onPreDraw(): Boolean {
            val lp = layoutView.getLayoutParams()
            if (lp is StaggeredGridLayoutManager.LayoutParams) {
                val sglp = lp as StaggeredGridLayoutManager.LayoutParams
                when (viewType) {
                    1 -> sglp.isFullSpan = false
                    2 -> {
                        sglp.height = layoutView.height * 2;
                        layoutView.refreshDrawableState();
                    }
                    3 -> sglp.height = layoutView.height * 3;
                }
                layoutView.setLayoutParams(sglp)
                val lm = (parent as RecyclerView).layoutManager as StaggeredGridLayoutManager
                lm.invalidateSpanAssignments()
            }
            layoutView.getViewTreeObserver().removeOnPreDrawListener(this)
            return true
        }
    })
    return ViewHolder(layoutView)
}

Где он умножается на количество часов, затраченное на собрание.

Проблема в том, что если после двухчасовой встречи проводится одночасовое собрание, оно переносится на следующий день.

См .:

С двухчасовымсобрания:

enter image description here

С 1-часовыми собраниями:

enter image description here

Как это исправить в адаптере / как я могу адаптировать высоту без смещения элементов?

1 Ответ

0 голосов
/ 19 мая 2018

Импорт библиотеки в ваш проект.Захватить через maven

<dependency>
  <groupId>com.github.alamkanak</groupId>
  <artifactId>android-week-view</artifactId>
  <version>1.2.6</version>
  <type>aar</type>
</dependency>

Захватить через gradle

compile 'com.github.alamkanak:android-week-view:1.2.6'

Добавить WeekView в свой XML-макет.

<com.alamkanak.weekview.WeekView
        android:id="@+id/weekView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:eventTextColor="@android:color/white"
        app:textSize="12sp"
        app:hourHeight="60dp"
        app:headerColumnPadding="8dp"
        app:headerColumnTextColor="#8f000000"
        app:headerRowPadding="12dp"
        app:columnGap="8dp"
        app:noOfVisibleDays="3"
        app:headerRowBackgroundColor="#ffefefef"
        app:dayBackgroundColor="#05000000"
        app:todayBackgroundColor="#1848adff"
        app:headerColumnBackground="#ffffffff"/>

Введите следующий код в свой Java-файл.

/

/ Get a reference for the week view in the layout.
mWeekView = (WeekView) findViewById(R.id.weekView);

// Set an action when any event is clicked.
mWeekView.setOnEventClickListener(mEventClickListener);

// The week view has infinite scrolling horizontally. We have to provide the events of a
// month every time the month changes on the week view.
mWeekView.setMonthChangeListener(mMonthChangeListener);

// Set long press listener for events.
mWeekView.setEventLongPressListener(mEventLongPressListener);

Реализация WeekView.MonthChangeListener, WeekView.EventClickListener, WeekView.EventLongPressListener в соответствии с вашими потребностями.

Предоставление событий для WeekView в WeekView.MonthChangeListener.onMon() Перезвоните.Помните, что в календаре предварительно загружаются события трех месяцев подряд, чтобы обеспечить беспроблемную прокрутку.

MonthLoader.MonthChangeListener mMonthChangeListener = new MonthLoader.MonthChangeListener() {
    @Override
    public List<WeekViewEvent> onMonthChange(int newYear, int newMonth) {
        // Populate the week view with some events.
        List<WeekViewEvent> events = getEvents(newYear, newMonth);
        return events;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...