RecyclerView очень медленный на некоторых устройствах (не на всех)

Прокрутка RecyclerView очень медленная на некоторых устройствах и нормальная на других Я столкнулся с этой проблемой в течение 3 дней, и я пробовал много решений из Интернета и stackoverflow, но все они не устранили эту проблему Я хочу добавить xml-макет много раз в раздутый макет ViewHolder Я делаю цикл внутри onBindViewHolder с макетом xml для проверки прокрутки но прокрутка очень медленная на некоторых устройствах и работает с другими делениями вот мой код адаптера просмотра ресайклера

public class ExamQuestionsListAdapter extends RecyclerView.Adapter<ExamQuestionsListAdapter.ViewHolder> {
public ExamQuestionsListAdapter(Context ctx, List<ExamQuestionsList> ex_Q_List) {
    this.ctx = ctx;
    this.ex_Q_List = ex_Q_List;


    dbManger=new DataBaseManager(ctx);
    db=dbManger.getWritableDatabase();


    shared = ctx.getSharedPreferences("examsShared", Context.MODE_PRIVATE);

}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new ViewHolder(LayoutInflater.from(ctx).inflate(R.layout.do_exam_card_view,parent,false));
}

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

    for(int i=0;i<30;i++){
        View v=LayoutInflater.from(ctx).inflate(R.layout.c_m_layout,null);
        holder.questionsLayout.addView(v);
    }

}

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

class ViewHolder extends RecyclerView.ViewHolder{

    LinearLayout questionsLayout;

    public ViewHolder(View itemView) {
        super(itemView);
        questionsLayout=(LinearLayout)itemView.findViewById(R.id.q_layout);


    }
}
}

и это XML-файл для макета, созданного методом onCreateViewHolder.

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout
xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "match_parent"
android:layout_height = "wrap_content">
<android.support.v7.widget.CardView
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:layout_marginTop = "5dp"
    android:layout_marginBottom = "5dp"
    android:padding = "10dp"

    >
    <LinearLayout
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        android:orientation = "vertical"
        android:id = "@+id/q_layout"
        android:background = "@color/orange"
        >
        <TextView
            android:layout_width = "match_parent"
            android:layout_height = "wrap_content"
            android:id = "@+id/question_tumber"
            />

        <TextView
            android:layout_width = "match_parent"
            android:layout_height = "wrap_content"
            android:id = "@+id/question_title"

            />
        <TextView
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:id = "@+id/res"
            />
    </LinearLayout>




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

и это xml-файл, который я использую в цикле for

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:orientation = "vertical" android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:layoutDirection = "rtl"
android:background = "#FFF"
>
<TextView
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content"

    android:id = "@+id/c_m_q"
    />
<RadioGroup
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content">

    <RadioButton
        android:layout_width = "0dp"
        android:layout_height = "wrap_content"
        android:layout_weight = "1"

        android:id = "@+id/first_choice"

        />
        <RadioButton
            android:layout_width = "0dp"
            android:layout_height = "wrap_content"
            android:layout_weight = "1"

            android:id = "@+id/second_choice"

            />
        <RadioButton
            android:layout_width = "0dp"
            android:layout_height = "wrap_content"
            android:layout_weight = "1"

            android:id = "@+id/third_choice"

            />
        <RadioButton
            android:layout_width = "0dp"
            android:layout_height = "wrap_content"
            android:layout_weight = "1"

            android:id = "@+id/fourth_choice"

            />

</RadioGroup>
</LinearLayout>

Эта строка вам стоит -> View v = LayoutInflater.from (ctx) .inflate (R.layout.c_m_layout, null) ‌; Holder.questionsLayout.addView (v);

Pankaj Kant Patel 10.03.2018 09:59

Мне нужно добавить макеты внутри держателя, потому что у каждого держателя есть подпункты, которые должны быть в отдельном макете

Ben Ghaleb 10.03.2018 10:03

Не нужно 30 раз раздувать макет, просто создайте еще один класс ViewHolder и назначьте ему данные.

Pankaj Kant Patel 10.03.2018 10:05

Я сделал цикл только для тестирования, не могли бы вы подождать несколько минут, я попробую ваше решение

Ben Ghaleb 10.03.2018 10:09

Вы неправильно используете recyclerview. Стоимость представления очень обременительна. Я бы посоветовал вам создать хэш-карту, чтобы связать подэлементы с равными им.

Mohamoud Mohamed 10.03.2018 10:09

извините, я заблудился, не могли бы вы привести мне пример или какой-нибудь онлайн-учебник

Ben Ghaleb 10.03.2018 10:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
521
1

Ответы 1

NestedScrollView, как следует из названия, используется, когда есть необходимость в прокручиваемом представлении внутри другого прокручиваемого представления. Обычно это было бы сложно выполнить, поскольку система не могла бы решить, какой вид прокручивать.

Именно здесь на помощь приходит NestedScrollView.

<android.support.v4.widget.NestedScrollView xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "match_parent">

<LinearLayout
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:orientation = "vertical">

    <RelativeLayout
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:padding = "@dimen/keyline_1">

    </RelativeLayout>

    <View
        android:id = "@+id/separator"
        android:layout_width = "match_parent"
        android:layout_height = "1dp"
        android:background = "#e5e5e5" />

   <android.support.v7.widget.RecyclerView
    android:id = "@+id/conversation"
    app:layout_behavior = "@string/appbar_scrolling_view_behavior"
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content" />

</LinearLayout>

</android.support.v4.widget.NestedScrollView>

здесь вы используете вложенное поведение с прокруткой, например добавление строки ниже в представлении корзины app: layout_behavior = "@ строка / appbar_scrolling_view_behavior"

Другие вопросы по теме