由于 Android 中的 setAdapter,滑动刷新视图动画卡住了
Swipe Refresh View's animation gettting stuck due to setAdapter in Android
我正在使用具有拉动刷新功能的 Recycleview,通过执行拉动刷新,我正在 Recycleview 中随机排列记录
现在我的问题是,一旦我使用 pull 刷新视图将新数组设置为 Recycleview。在这里,Swipe Refresh 视图会卡住,实际上整个 Recycleview 都会由于 notifyDataSetChange() 方法而卡住,这个问题只存在 1 或 2 秒。另外,我的记录数是数组是 200,所以可能也是这种情况。
仅供参考:我可以在此处为此任务添加一个进度条,但我不想阻止用户交互,因此我可以在 UI 中设置适配器而不会出现任何 lag/stuck 问题的任何帮助?
适配器
public class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.MyViewHolder> implements View.OnClickListener {
public Context context;
List<Model.Result> list;
Controller controller;
CommonFunctions cmf;
String user_id;
int layout;
ImageLoader imageLoader;
private DisplayImageOptions options;
public BaseAdapter(Context context, List<Model.Result> list, int layout, Controller controller) {
this.context = context;
this.list = list;
this.controller = controller;
this.layout = layout;
imageLoader = ImageLoader.getInstance(); // Get singleton instance
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.placeholder_ic)
.showImageOnFail(R.drawable.placeholder_ic)
.cacheInMemory(true)
.cacheOnDisk(true)
.build();
cmf = new CommonFunctions(context);
user_id = CommonFunctions.myPreference.getString(context, GlobalConstants.id);
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(layout, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int pos) {
// holder.name.setText(list.get(pos).getCatName());
if (holder.name != null)
holder.name.setText(list.get(pos).getAudioName());
if (holder.title != null)
holder.title.setText(list.get(pos).getArtistName());
if (holder.timeDuration != null)
holder.timeDuration.setText(list.get(pos).getAudiolength());
if(holder.txtTopicName!=null)
holder.txtTopicName.setText(list.get(pos).getCatName());
if (holder.image != null) {
imageLoader.displayImage(list.get(pos).getAudioImage(), holder.image,options);
}
}
@Override
public int getItemCount() {
return list.size();
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.TV_title) {
}
}
public class MyViewHolder extends RecyclerView.ViewHolder {
LinearLayout ll_row;
ImageView iv_more, image;
TextView name, title, timeDuration,txtTopicName;
public MyViewHolder(View itemView) {
super(itemView);
ll_row = itemView.findViewById(R.id.ll_row);
iv_more = itemView.findViewById(R.id.iv_more);
image = itemView.findViewById(R.id.image);
name = itemView.findViewById(R.id.name);
title = itemView.findViewById(R.id.title);
timeDuration = itemView.findViewById(R.id.time_duration);
txtTopicName = itemView.findViewById(R.id.txtTopicName);
}
}
}
刷新视图
binding.swipeLayout.setOnRefreshListener(() -> {
binding.swipeLayout.setRefreshing(false);
if(array!=null&&array.size()>0){
Collections.shuffle(array, new Random());
binding.recyclerView.setAdapter(new BaseAdapter(getActivity(),array, layout,null));
}
});
我没有在视图绑定中工作过,但在下面看到了罪魁祸首。
binding.recyclerView.setAdapter(new BaseAdapter(getActivity(),array, layout,null));
// 创建构造函数的繁重操作以及最重要的
看看你的适配器class,有多重。
您的 Base 适配器构造函数看起来很重,
imageLoader = ImageLoader.getInstance(); // Get singleton instance
options = new DisplayImageOptions.Builder() // heavy
.showImageOnLoading(R.drawable.placeholder_ic)
.showImageOnFail(R.drawable.placeholder_ic)
.cacheInMemory(true)
.cacheOnDisk(true)
.build();
我建议,
+ 接下来在创建适配器期间,传递一个空列表。
- 为什么不在创建适配器的主机 class 中初始化 DisplayImageOptions 实例并将初始化的实例传递给适配器。
这种方式的开销是在主机 class 而不是适配器上进行的。
最后,当滑动完成后,一个新的 lest 就准备好了。
mAdapter.setNewList(任意列表){
this.yourList = 新列表;
通知数据集已更改。
}
这应该可以完成工作
我正在使用具有拉动刷新功能的 Recycleview,通过执行拉动刷新,我正在 Recycleview 中随机排列记录
现在我的问题是,一旦我使用 pull 刷新视图将新数组设置为 Recycleview。在这里,Swipe Refresh 视图会卡住,实际上整个 Recycleview 都会由于 notifyDataSetChange() 方法而卡住,这个问题只存在 1 或 2 秒。另外,我的记录数是数组是 200,所以可能也是这种情况。
仅供参考:我可以在此处为此任务添加一个进度条,但我不想阻止用户交互,因此我可以在 UI 中设置适配器而不会出现任何 lag/stuck 问题的任何帮助?
适配器
public class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.MyViewHolder> implements View.OnClickListener {
public Context context;
List<Model.Result> list;
Controller controller;
CommonFunctions cmf;
String user_id;
int layout;
ImageLoader imageLoader;
private DisplayImageOptions options;
public BaseAdapter(Context context, List<Model.Result> list, int layout, Controller controller) {
this.context = context;
this.list = list;
this.controller = controller;
this.layout = layout;
imageLoader = ImageLoader.getInstance(); // Get singleton instance
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.placeholder_ic)
.showImageOnFail(R.drawable.placeholder_ic)
.cacheInMemory(true)
.cacheOnDisk(true)
.build();
cmf = new CommonFunctions(context);
user_id = CommonFunctions.myPreference.getString(context, GlobalConstants.id);
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(layout, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int pos) {
// holder.name.setText(list.get(pos).getCatName());
if (holder.name != null)
holder.name.setText(list.get(pos).getAudioName());
if (holder.title != null)
holder.title.setText(list.get(pos).getArtistName());
if (holder.timeDuration != null)
holder.timeDuration.setText(list.get(pos).getAudiolength());
if(holder.txtTopicName!=null)
holder.txtTopicName.setText(list.get(pos).getCatName());
if (holder.image != null) {
imageLoader.displayImage(list.get(pos).getAudioImage(), holder.image,options);
}
}
@Override
public int getItemCount() {
return list.size();
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.TV_title) {
}
}
public class MyViewHolder extends RecyclerView.ViewHolder {
LinearLayout ll_row;
ImageView iv_more, image;
TextView name, title, timeDuration,txtTopicName;
public MyViewHolder(View itemView) {
super(itemView);
ll_row = itemView.findViewById(R.id.ll_row);
iv_more = itemView.findViewById(R.id.iv_more);
image = itemView.findViewById(R.id.image);
name = itemView.findViewById(R.id.name);
title = itemView.findViewById(R.id.title);
timeDuration = itemView.findViewById(R.id.time_duration);
txtTopicName = itemView.findViewById(R.id.txtTopicName);
}
}
}
刷新视图
binding.swipeLayout.setOnRefreshListener(() -> {
binding.swipeLayout.setRefreshing(false);
if(array!=null&&array.size()>0){
Collections.shuffle(array, new Random());
binding.recyclerView.setAdapter(new BaseAdapter(getActivity(),array, layout,null));
}
});
我没有在视图绑定中工作过,但在下面看到了罪魁祸首。
binding.recyclerView.setAdapter(new BaseAdapter(getActivity(),array, layout,null));
// 创建构造函数的繁重操作以及最重要的 看看你的适配器class,有多重。 您的 Base 适配器构造函数看起来很重,
imageLoader = ImageLoader.getInstance(); // Get singleton instance
options = new DisplayImageOptions.Builder() // heavy
.showImageOnLoading(R.drawable.placeholder_ic)
.showImageOnFail(R.drawable.placeholder_ic)
.cacheInMemory(true)
.cacheOnDisk(true)
.build();
我建议, + 接下来在创建适配器期间,传递一个空列表。
- 为什么不在创建适配器的主机 class 中初始化 DisplayImageOptions 实例并将初始化的实例传递给适配器。
这种方式的开销是在主机 class 而不是适配器上进行的。
最后,当滑动完成后,一个新的 lest 就准备好了。
mAdapter.setNewList(任意列表){ this.yourList = 新列表; 通知数据集已更改。 }
这应该可以完成工作