我想异步返回recyclerview onCreateViewHolder()中的viewHolder。
开始时,
viewHolder
应该像在第一行中一样(并且一直有效),但是一旦稍后调用我的回调,viewHolder
应该像我的回调中设置的那样。不幸的是,这永远不会发生。这是代码:
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
viewHolder = new VHStart(LayoutInflater.from(fragment.requireContext()).inflate(R.layout.item_note_loading,parent,false));
if (viewType == VIEW_TYPE_ONE) {
MyView myView = new MyView(parent.getContext(), this);
myView.inflate(new OnFinishedInflated() {
@Override
public void onFinished(View view) {
viewHolder = new VHSingleElement(view);
}
});
} else if (viewType == VIEW_TYPE_TWO) {
// will add this later
} else
throw new RuntimeException("No such view type");
return viewHolder;
}
如何解决?
AsyncLayoutManager
的全部意义在于它不会阻塞UI线程 - 所以当你告诉mView
到inflate
时它会立即转到下一条指令(return viewHolder
),因为通货膨胀会转到后台线程。
您无法追溯更改函数返回的内容。
您想要将每个
ViewHolder
类型设置为具有初始状态 - 基本上是您的 VHStart
当前的状态,并具有内部过渡到其最终形式。
此模式最基本的版本是
ProgressBar
,一旦内容加载,您就隐藏/删除。
class AsyncVH : RecyclerView.ViewHolder(view) {
private var isInflated: Boolean = false
private var item: Item? = null
private var view: View
AsyncVH(view: View) {
ViewGroup itemParent = (ViewGroup) view
AsyncLayoutInflater(view.context).inflate(new OnFinishedInflated() {
@Override
public void onFinished(View asyncView) {
// Hide/remove if you have initial progress view from view
itemParent.clearAll() // view.findViewById(R.id.progress).setVisibility(View.GONE)
itemParent.addView(asyncView)
isInflated = true
bind()
}
});
}
void bind(item: Item) {
this.item = item
if(isInflated) {
bind()
}
}
private void bind() {
if (isInflated && item != null) {
// bind
}
}
}