Android 更改 onCreateViewHolder() 从自定义回调返回 viewHolder

问题描述 投票:0回答:1

我想异步返回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;
}

如何解决?

java android android-recyclerview
1个回答
0
投票

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
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.