Как установить два RecyclerView одинакового размера на экране, сохраняя содержимое переноса по высоте, чтобы избежать пробелов - PullRequest
0 голосов
/ 21 января 2019

Я хочу установить два RecyclerView s на экране равной высоты, чтобы покрыть экран одинаково, проблема в том, что если я использую высоту, поскольку wrap_content представления не расширяются одинаково, и если я фиксирую их высоту или дайте им layout_weight, чем будет пробел, если один из списка пуст.

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

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Используйте код ниже Надеюсь, что это будет работать

int x=this. getResources().getDisplayMetrics().heightPixels*1/2;
recyclerview1.setLayoutParams(new LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams.WRAP_CONTENT, x));
recyclerview2.setLayoutParams(new LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams.WRAP_CONTENT, x));
0 голосов
/ 21 января 2019

Вы не можете сделать это только в XML. Вам понадобится немного Java. Вы были на правильном пути с весами макета.

Скелет XML:

<LinearLayout
    android:orientation="vertical">

    <RecyclerView
        android:id="@+id/recView1"
        android:layout_height="0dp"
        android:layout_weight="1"
    />

    <RecyclerView
        android:id="@+id/recView2"
        android:layout_height="0dp"
        android:layout_weight="1"
    />

</LinearLayout>

Следующая часть должна быть сделана на Java.

Добавьте наблюдатель данных в оба адаптера и обязательно переопределите все методы, чтобы они вызывали onChanged(). Затем внутри onChanged() получите счетчик текущего адаптера и установите видимость RecyclerView соответствующим образом.

Вот пример для первого:

recView1.getAdapter().registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
    @Override
    public void onChanged() {
        recView1.setVisibility(recView1.getAdapter().getItemCount() > 0 ? View.VISIBLE : View.GONE);
    }

    @Override
    public void onItemRangeChanged(int positionStart, int itemCount) {
        onChanged();
    }

    @Override
    public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
        onChanged();
    }

    @Override
    public void onItemRangeInserted(int positionStart, int itemCount) {
        onChanged();
    }

    @Override
    public void onItemRangeRemoved(int positionStart, int itemCount) {
        onChanged();
    }

    @Override
    public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
        onChanged();
    }
}

На практике вам, вероятно, следует извлекать обоих наблюдателей в переменные, чтобы вы могли отменить их регистрацию, когда содержащее действие / окно / все, что уничтожено.

...