我的应用程序完全是关于性能的,所以我真的很想尽可能地优化此RecyclerView。我测量了每个部分完成所需的时间,整个过程需要大约150ms的加载时间。这是相关代码:
public class AppAdapter extends RecyclerView.Adapter<AppAdapter.TabViewHolder> {
private Context context;
private MenuActivity menuActivity;
private Intent intent;
private ArrayList<String> stringys = new ArrayList<>();
public void setUpAdapter(Context mContext, MenuActivity mMenuActivity, Intent mIntent, ArrayList<String> mString) {
this.menuActivity = mMenuActivity;
this.context = mContext;
this.intent = mIntent;
stringys.addAll(mString);
}
@Override
public TabViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
Log.d(TAG, "CreatingViewholder " + "Time: " + menuActivity.deltaTime());
View view = inflater.inflate(R.layout.item_tab, parent, false); //Here is where the wait happens
Log.d(TAG, "ViewHolderCreated " + "Time: " + menuActivity.deltaTime());
return new TabViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull TabViewHolder holder, int position) {
holder.bind(position, holder);
}
@Override
public int getItemCount() {
return stringys.size();
}
class TabViewHolder extends RecyclerView.ViewHolder {
TextView text;
ImageView image;
TabViewHolder(View itemView) {
super(itemView);
text = itemView.findViewById(R.id.label);
image = itemView.findViewById(R.id.icon);
}
void bind(int position, TabViewHolder holder) {
new LongOperation(text, image).execute(stringys.get(position));
}
}
private class LongOperation extends AsyncTask<String, Void, Void> {
TextView text;
ImageView image;
CharSequence textToSet;
Drawable imageToSet;
public LongOperation(TextView text, ImageView image) {
super();
this.text = text;
this.image = image;
}
@Override
protected Void doInBackground(String... params) {
textToSet = params[0].getTitle(context.getDefaultSharedPreferences());
imageToSet = params[0].getIcon(context.getDefaultSharedPreferences());
return null;
}
@Override
protected void onPostExecute(Void result) {
text.setText(textToSet);
image.setImageDrawable(imageToSet);
}
}
}
对此我有几个想法/问题:
context.getDefaultSharedPreferences()
。如果我做了一次并将其作为变量传递,它将加载得更快(异步部分)吗?答案 0 :(得分:0)
RecyclerView
用于长列表,ViewHolder
模式的实现通过在视图离开屏幕后重新使用视图来提高性能。如果您没有足够的项目来填充视口,则没有理由使用它。
还要记住,调试设置位图的速度要慢得多,如果可能,请尝试将其构建为“发布”并查看其性能。
答案 1 :(得分:0)
其他改进:
您可以将LayoutInflater
的创建内容移至setUpAdapter()
R.layout.item_tab
中有什么?确保视图层次尽可能平坦。如果可以,请使用约束布局。