我正在使用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>
答案 0 :(得分:1)
我认为您的回收者视图需要花费一些时间来收集数据。连击 以在单独的线程上收集数据并在后台异步运行,并在完成后重新连接到Activity。
具体来说,在后台运行查询,并在与查询关联的数据发生更改时自动重新运行它。
异步代码完成后,您应该更新数据,而不是视图。更新数据后,告诉适配器数据已更改。 RecyclerView会注意到这一点并刷新您的视图。
答案 1 :(得分:1)
也许您可以尝试使用分页库:https://developer.android.com/topic/libraries/architecture/paging
您的适配器实际上很简单,没有任何会影响加载速度的陷阱。尤其如此,因为您只需为一个TextView
设置文本并设置Button
的功能。
简单的TextView
和Button
也应该表示您没有用于View的嵌套布局,这可能会在最初扩大布局时影响性能。
因此,如果您仍然遇到缓慢的加载时间,我认为这应该与以下方面有关:
服务器需要优化
数据网络速度
正在加载的数据量
由于第三个原因,如果您只是简单地加载太多数据并且让您的应用处理太多数据,然后再将其显示在RecyclerView
中,则可以这样做。
因此,分页库旨在帮助您以较小的批次管理和获取数据量,因为经常,如果您一次只显示10个,则没有理由获取100个。
答案 2 :(得分:0)
尝试使用LiveData。这些对象是线程安全的。在单独的线程上处理数据查询,然后使用LiveData方法“ postValue”将您的值发送回观察者。您可以从Android网站上的官方文档中找到很好的示例。他们使用MVVM模式。