如何增加更快的 recyclerView 负载?
How to increase faster recyclerView load?
我正在使用 recyclerview 从我的服务器加载数据。没有图像只有文本将从服务器加载。但是加载速度很慢。现在,我想知道是否有任何方法可以改善加载时间。
虽然我检查了几个博客和问题,但我无法解决我的问题。
我已经检查了这个:,但无法解决我的问题。
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:我的适配器class
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 会注意到这一点并刷新您的视图。
也许你可以试试分页库:https://developer.android.com/topic/libraries/architecture/paging
您的适配器实际上非常简单,没有任何可能影响加载速度的缺陷。尤其如此,因为您只是为一个 TextView
设置文本并设置 Button
的功能。
简单的 TextView
和 Button
还应该意味着您没有用于视图的嵌套布局,这可能会在最初扩展布局时影响性能。
因此,如果您仍然遇到加载时间缓慢的问题,在我看来,这应该与:
需要优化的服务器
数据网络速度
正在加载的数据量
对于第三个原因,如果您只是简单地加载了太多数据并让您的应用在 RecyclerView
中显示数据之前处理了太多数据,则这是可能的。
因此,分页库旨在帮助您以较小的批次管理和获取数据量,因为通常情况下,如果您一次只显示 10 个,则没有理由获取 100 个。
尝试使用 LiveData。这些对象是 thread-safe。在单独的线程上处理您的数据查询,然后使用 LiveData 方法 "postValue" 将您的值传回观察者。您可以从 Android 网站上的官方文档中找到非常好的示例。他们使用 MVVM 模式。
我正在使用 recyclerview 从我的服务器加载数据。没有图像只有文本将从服务器加载。但是加载速度很慢。现在,我想知道是否有任何方法可以改善加载时间。
虽然我检查了几个博客和问题,但我无法解决我的问题。
我已经检查了这个:
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:我的适配器class
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 会注意到这一点并刷新您的视图。
也许你可以试试分页库:https://developer.android.com/topic/libraries/architecture/paging
您的适配器实际上非常简单,没有任何可能影响加载速度的缺陷。尤其如此,因为您只是为一个 TextView
设置文本并设置 Button
的功能。
简单的 TextView
和 Button
还应该意味着您没有用于视图的嵌套布局,这可能会在最初扩展布局时影响性能。
因此,如果您仍然遇到加载时间缓慢的问题,在我看来,这应该与:
需要优化的服务器
数据网络速度
正在加载的数据量
对于第三个原因,如果您只是简单地加载了太多数据并让您的应用在 RecyclerView
中显示数据之前处理了太多数据,则这是可能的。
因此,分页库旨在帮助您以较小的批次管理和获取数据量,因为通常情况下,如果您一次只显示 10 个,则没有理由获取 100 个。
尝试使用 LiveData。这些对象是 thread-safe。在单独的线程上处理您的数据查询,然后使用 LiveData 方法 "postValue" 将您的值传回观察者。您可以从 Android 网站上的官方文档中找到非常好的示例。他们使用 MVVM 模式。