Как быстрее увеличить загрузку recyclerView? - PullRequest
0 голосов
/ 22 февраля 2019

Я использую recyclerview для загрузки данных с моего сервера.Там нет изображений, только тексты будут загружены с сервера.Но скорость загрузки довольно медленная. Теперь я хочу знать, есть ли способы улучшить время загрузки. Хотя я проверил несколько блогов и вопросов, я не смог решить мою проблему. Я проверил это: Быстрая загрузка RecyclerView без ScrollView , но не смог исправить мою проблему.

XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/swipe_layout"
    tools:context=".Activities.SwitchCompany">


    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:layout_margin="5dp"
        android:id="@+id/companySwitchRecyclerViewXML"/>

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

Java: Мой класс адаптера

public class RecyclerViewAdapterForCompanySwitch extends RecyclerView.Adapter<RecyclerViewAdapterForCompanySwitch.CompanyViewHolder> {
    private Context context;
    private ArrayList<CompanyModel> companyInformationArrayList;

    public RecyclerViewAdapterForCompanySwitch(Context context,ArrayList<CompanyModel> companyInformationArrayList){
        this.context=context;
        this.companyInformationArrayList =companyInformationArrayList;
    }

    @Override
    public CompanyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_row_style_for_switch_company_layout,parent,false);
        RecyclerViewAdapterForCompanySwitch.CompanyViewHolder companyViewHolder=new RecyclerViewAdapterForCompanySwitch.CompanyViewHolder(view);
        return companyViewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull CompanyViewHolder holder, int position) {
        final CompanyModel companyModel= companyInformationArrayList.get(position);
        holder.companyName.setText(companyModel.getCompanyName());
        holder.goButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                context.startActivity(new Intent(context, HomeActivity.class).putExtra("companyID",companyModel.getId()).putExtra("companyName",companyModel.getCompanyName())
                .putExtra("companyEmail",companyModel.getEmail()));
            }
        });
    }

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

    public class CompanyViewHolder extends RecyclerView.ViewHolder{
        TextView companyName;
        Button goButton;
        public CompanyViewHolder(View itemView) {
            super(itemView);
            companyName=itemView.findViewById(R.id.companyNameXML);
            goButton=itemView.findViewById(R.id.goButtonXML);
        }
    }
}

Мой код утилитарного просмотра_row_style_for_switch_company_layout:

<?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:background="@drawable/layout_shadow"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Company Name"
        android:textColor="@android:color/white"
        android:background="@color/colorPrimary"
        android:textStyle="bold"
        android:gravity="center"
        android:textSize="18sp"
        android:padding="5dp"
        android:layout_margin="5dp"
        android:id="@+id/companyNameXML"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="#FFffffff"
        android:textSize="18sp"
        android:text="@string/buttontext"
        android:id="@+id/goButtonXML"
        android:textAllCaps="false"
        android:layout_margin="5dp"
        android:padding="5dp"/>
    <View
        style="@style/Divider"/>

</LinearLayout>

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Возможно, вы могли бы попробовать библиотеку подкачки: https://developer.android.com/topic/libraries/architecture/paging

Ваш адаптер на самом деле достаточно прост, чтобы в нем не было ловушек, которые могут повлиять на скорость загрузки.Это особенно верно, потому что вы просто устанавливаете текст для одного TextView и устанавливаете функцию Button.

Простые TextView и Button также должны означать, что у вас нет вложенного макета, используемого для просмотра, что может повлиять на производительность при первоначальном надувании макета.

Так что, если вы все еще испытываете медленное время загрузки, по моему мнению, это должно быть связано с:

  1. Сервер, требующий оптимизации

  2. Скорость передачи данных

  3. Количество загружаемых данных

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

Таким образом, библиотека подкачки предназначена для того, чтобы помочь вам управлять и извлекать объем данных в меньших пакетах, потому что часто нет причин выбирать 100, если вы собираетесь показывать только 10 одновременно.

0 голосов
/ 06 июня 2019

Попробуйте использовать LiveData.эти объекты потокобезопасны.Обработайте ваши запросы данных в отдельном потоке, а затем используйте метод LiveData "postValue", чтобы передать ваши значения обратно наблюдателю.Вы можете найти очень хорошие примеры из официальной документации на сайте Android.Они используют шаблон MVVM.

0 голосов
/ 22 февраля 2019

Я полагаю, что ваше представление о переработчике требует времени для сбора данных.Необходимо собирать данные в отдельном потоке, асинхронно работать в фоновом режиме и повторно подключаться к Activity, когда закончите.

В частности, запустите запрос в фоновом режиме и автоматически перезапустите его, когда данные, связанные с запросом, изменятся.

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

...