PagedListAdapter извлекает все элементы, когда представление переработчика помещается внутри nestedscrollview - PullRequest
0 голосов
/ 12 мая 2019

Я использую NestedScrollView, и внутри него у меня есть текст для редактирования и кнопки, а затем RecyclerView.Когда я открываю упражнение, все элементы начинают извлекаться с сервера с использованием PageKeyedDataSource, а RecyclerView прокручивается очень медленно, и в конце приложение показывает ANR.

Я посмотрел эту проблему в репозитории GitHub android-Architecture-компоненты и обнаружили, что SmartNestedScrollView может решить проблему, но когда я использую SmartNestedScrollView, то прокручивается только небольшая часть моего представления рециркулятора.

https://github.com/googlesamples/android-architecture-components/issues/215

LayoutFile.xml

<?xml version="1.0" encoding="utf-8"?>
<com.magtappofficial.app.utilities.SmartNestedScrollView
    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:fillViewport="true"
    android:layout_margin="16dp"
    tools:context=".ui.Home">

<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <LinearLayout
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:layout_width="0px"
            android:layout_height="0px"/>


    <EditText.../>

    <ImageView.../>

    <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/newsProgress"
            android:layout_marginTop="16dp"
            app:layout_constraintTop_toBottomOf="@+id/exclusiveForYou"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="8dp"
            android:layout_marginRight="8dp"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginLeft="8dp"
            android:layout_marginStart="8dp"/>

    <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/newsRecycler"
            android:layout_marginTop="16dp"
            app:layout_constraintTop_toBottomOf="@+id/exclusiveForYou"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="8dp"
            android:layout_marginRight="8dp"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginLeft="8dp"
            android:layout_marginStart="8dp"/>

</androidx.constraintlayout.widget.ConstraintLayout>

</com.magtappofficial.app.utilities.SmartNestedScrollView>

Может кто-нибудь, скажите, пожалуйста, что еще я могу сделать?

1 Ответ

0 голосов
/ 17 мая 2019

Примечание: это не лучшая практика, это просто обходной путь, и если у кого-то есть какой-либо лучший ответ, пожалуйста, поделитесь.

Для тех из васкто все еще ищет ответ, у меня есть простое исправление.

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

Layout Blueprint

Внутри представления Recycler:

const val HEADER = 0
const val REAL_ITEM = 1

Метод getItemViewType, который возвращает тип представления onCreateViewHolder.

override fun getItemViewType(position: Int): Int {
        return when (position) {
            0 -> HEADER
            else -> REAL_ITEM
        }
    }

Внутри метода onCreateViewHolder:

override fun onCreateViewHolder(p0: ViewGroup, p1: Int): NewsViewHolder {
        val view = when (p1) {
            HEADER -> {
                LayoutInflater.from(ctx).inflate(R.layout.rv_header, p0, false)
            }
            else -> LayoutInflater.from(ctx).inflate(R.layout.xyz, p0, false)
        }
        return SomeViewHolder(view)
    }

Внутри onBindViewHolder вы можете получить тип представления и связать данные в соответствии с требованиями представления.

override fun onBindViewHolder(p0: NewsViewHolder, p1: Int) {
        val viewType = getItemViewType(p1)
}
...