如何增加更快的recyclerView负载?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何增加更快的recyclerView负载?相关的知识,希望对你有一定的参考价值。

我正在使用recyclerview从我的服务器加载数据。没有图像只会从服务器加载文本。但加载速度非常慢。现在,我想知道是否有任何方法可以改善加载时间。虽然我检查了几个博客和问题但我无法解决我的问题。我检查过这个:Fast load RecyclerView withing 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);
        }
    }
}

我的recyclerview_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>
答案

我假设您的回收站视图需要时间来收集数据。在单独的线程上收集数据并在后台异步运行并在完成后重新连接到Activity是很重要的。

具体来说,在后台运行查询,并在与查询关联的数据发生更改时自动重新运行查询。

异步代码完成后,您应该更新数据,而不是视图。更新数据后,告诉适配器数据已更改。 RecyclerView会记下这一点并刷新您的视图。

另一答案

也许你可以试试Paging Library:https://developer.android.com/topic/libraries/architecture/paging

您的适配器实际上非常简单,它没有任何可能影响加载速度的陷阱。这尤其正确,因为您只是为一个TextView设置文本并设置Button的功能。

简单的TextViewButton也意味着你没有用于View的嵌套布局,这可能会影响初始膨胀布局时的性能。

因此,如果您仍然遇到缓慢的加载时间,我认为它应该与以下内容相关:

  1. 需要优化的服务器
  2. 数据网络速度
  3. 正在加载的数据量

由于第三个原因,如果您只是在RecyclerView中显示数据并且让应用处理过多数据,那么这是可能的。

因此,分页库旨在帮助您以较小批量管理和获取大量数据,因为如果您一次只显示10个,则没有理由获取100。

以上是关于如何增加更快的recyclerView负载?的主要内容,如果未能解决你的问题,请参考以下文章

具有捕捉全屏卡片的垂直 RecyclerView

查看系统负载情况

Android RecyclerView 设置item间隔的方法

如何为mysql分片集群设置片键

在滚动列表中实现视频的播放(ListView & RecyclerView)

Android在滚动列表中实现视频的播放 ListView RecyclerView