【发布时间】:2018-11-17 13:41:01
【问题描述】:
如何在不锁定 UI 的情况下初始化 RecyclerView 适配器? 我要做的就是在创建适配器视图时显示进度条,完成该操作后隐藏进度条并显示完成的 recyclerview 适配器。
问题是当 i .setAdapter() 时,UI 会冻结一小会儿,并且进度条会在那一刻冻结。
我不知道如何解决这个问题,因为视图相关的操作必须在 UI 线程中完成。
有什么想法吗?
代码: 从 db 加载数据:
dataLoader = Observable
.just(getApplication().getDbHelper())
.map(this::doInBackground)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onPostExecute);
onPostExecute 方法:
entriesAdapter = new EntriesAdapter(getApplication(), loadedData.entries);
this.loadedData = loadedData;
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
viewHolder.entries.setHasFixedSize(true);
viewHolder.entries.setLayoutManager(layoutManager);
viewHolder.entries.setItemAnimator(new DefaultItemAnimator());
viewHolder.entries.setAdapter(entriesAdapter);
适配器代码:
public class EntriesAdapter extends RecyclerView.Adapter<EntriesAdapter.ViewHolder> {
private BudgeterApplication app;
private List<Expense> entries;
private CompositeDisposable compositeDisposable;
public EntriesAdapter(BudgeterApplication app, List<Expense> entries) {
this.app = app;
this.entries = entries;
}
public void setEntries(List<Expense> entries) {
this.entries = entries;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new ViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.expense_list_row, viewGroup, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
Expense expense = entries.get(i);
viewHolder.getSumText().setText(BigDecimalUtils.convertToCurrencyString(expense.getSum()));
viewHolder.getCommentText().setText(expense.getComment() == null ? "" : expense.getComment());
viewHolder.getDateText().setText(DateUtils.convertToString(expense.getTimeStamp(), "MM-dd HH:mm"));
}
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
compositeDisposable = new CompositeDisposable();
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
if (compositeDisposable != null && !compositeDisposable.isDisposed()) {
compositeDisposable.dispose();
}
super.onDetachedFromRecyclerView(recyclerView);
}
@Override
public int getItemCount() {
return entries.size();
}
@Getter
class ViewHolder extends RecyclerView.ViewHolder {
private View parent;
private TextView sumText;
private TextView commentText;
private TextView dateText;
ViewHolder(@NonNull View itemView) {
super(itemView);
this.parent = itemView;
init();
}
private void init() {
sumText = parent.findViewById(R.id.sum_text);
commentText = parent.findViewById(R.id.comment_text);
dateText = parent.findViewById(R.id.date_text);
}
}
}
【问题讨论】:
-
请将您的代码粘贴到出现此问题的位置
-
@Ali 我做了,请看一下:)
-
@Kunu 我只加载不再是 20 个符号(即最大)的文本数据,所以这不相关
-
您找到解决方案了吗?这在速度较慢的手机上很明显
标签: android performance asynchronous android-recyclerview