如何增加更快的recyclerView负载?

时间:2019-02-22 04:46:10

标签: android android-recyclerview recycler-adapter recyclerview-layout

我正在使用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>

3 个答案:

答案 0 :(得分:1)

我认为您的回收者视图需要花费一些时间来收集数据。连击 以在单独的线程上收集数据并在后台异步运行,并在完成后重新连接到Activity。

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

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

答案 1 :(得分:1)

也许您可以尝试使用分页库:https://developer.android.com/topic/libraries/architecture/paging

您的适配器实际上很简单,没有任何会影响加载速度的陷阱。尤其如此,因为您只需为一个TextView设置文本并设置Button的功能。

简单的TextViewButton也应该表示您没有用于View的嵌套布局,这可能会在最初扩大布局时影响性能。

因此,如果您仍然遇到缓慢的加载时间,我认为这应该与以下方面有关:

  1. 服务器需要优化

  2. 数据网络速度

  3. 正在加载的数据量

由于第三个原因,如果您只是简单地加载太多数据并且让您的应用处理太多数据,然后再将其显示在RecyclerView中,则可以这样做。

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

答案 2 :(得分:0)

尝试使用LiveData。这些对象是线程安全的。在单独的线程上处理数据查询,然后使用LiveData方法“ postValue”将您的值发送回观察者。您可以从Android网站上的官方文档中找到很好的示例。他们使用MVVM模式。