【问题标题】:Is initializing a new RecyclerView Adapter an asynchronous call?初始化新的 RecyclerView 适配器是异步调用吗?
【发布时间】:2020-03-25 08:23:02
【问题描述】:

我的问题是,新的RecyclerView 适配器的初始化是异步调用吗?

我正在创建一个适配器:

mRecyclerAdapter = new TestAdapter(mContext, mListImages);
mRecycler.setLayoutManager(mLayoutManager);
mRecycler.setAdapter(mRecyclerAdapter);

初始化之后,我可以在这些方法之后直接调用.add()而不调用.notifyDataSetChanged(),它们仍然会添加到我的适配器中,并显示出来。

mRecyclerAdapter = new TestAdapter(mContext, mListImages);
mRecycler.setLayoutManager(mLayoutManager);
mRecycler.setAdapter(mRecyclerAdapter);

mListImages.add( . . .);
mListImages.add( . . .);
mListImages.add( . . .);

RecyclerView 适配器是否在后台线程上自动初始化?

这是我的适配器:

public class SelectBucketAdapter extends RecyclerView.Adapter<SelectBucketAdapter.ViewHolder> {

    private static final String TAG = "SelectBucketAdapter";

    private Context mContext;
    private ArrayList<String> mBucketList;

    public SelectBucketAdapter(Context mContext, ArrayList<String> mBucketList,
                               ) {
        this.mContext = mContext;
        this.mBucketList = mBucketList;

    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        View view = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.vh_selectbucketmenu_layout, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int i) {
        ... binding views
    }

    @Override
    public int getItemCount() {
        return mBucketList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

        @BindView(R.id.vh_selectbucketmenu_name)
        TextView vhBucketName;


        int mPosition;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);

        }


    }
}

【问题讨论】:

    标签: java android android-recyclerview android-view android-adapter


    【解决方案1】:

    RecyclerView 适配器是否在后台线程上自动初始化?

    不,他们不是。

    新的RecyclerView适配器的初始化是异步调用吗?

    不,不是。

    布局创建和附加到窗口异步的。

    这是什么意思?

    假设我们有以下代码:

    override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      ...
    
      val adapter = MyAdapter()
      recyclerView.adapter = adapter
    
      adapter.list.add("1")
    }
    

    在这种情况下,我们将看到屏幕上显示“1”,因为在执行 adapter.list.add("1") 时,RecyclerView 尚未通过其 measure-layout-draw 循环。

    现在让我们考虑以下代码:

    override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      ...
    
      val adapter = MyAdapter()
      recyclerView.adapter = adapter
    
      Handler().postDelayed({ adapter.list.add("AAA") }, 2000)
    }
    

    在这种情况下,adapter.list.add("AAA") 将在大约 2 秒内执行。只要 RecyclerView 届时已经布局,那么改变适配器数据集不会使 RecyclerView 显示该项目,因为 RecyclerView 不知道数据集是否发生了变化。

    让我们考虑以下情况:

    override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      ...
    
      val adapter = MyAdapter()
      recyclerView.adapter = adapter
    
      recyclerView.doOnPreDraw { adapter.list.add("preDraw") }
      recyclerView.doOnLayout { adapter.list.add("layout") }
      adapter.list.add("onCreate")
    }
    

    在这种情况下,屏幕上仍然只会显示“onCreate”

    总结一下:一旦RecyclerView 通过了它的测量步骤(即View#onMeasure),除非适配器明确通知RecyclerView.,否则变异适配器将不会被反映

    【讨论】:

      【解决方案2】:

      “初始化”一词非常含糊。您在什么时候认为适配器已“初始化”?对我来说,Adapter 可以用 0 个项目初始化。所以你不能通过查看RecyclerView的内容来衡量Adapter是否已经被初始化。

      其次,您要问“初始化是否是异步调用”。 RecyclerView Adapter 的“初始化”是一大堆调用。您观察到这些调用的结果并不总是立即可见 - 这告诉您至少在幕后发生的一些事情是异步的。

      我认为您要问的是“您需要在 RecyclerView 的生命周期中的哪个时间点通知适配器更改”。听起来答案是“一旦RecyclerView 达到onMeasure()(基于@azizbekian 的回答)。

      如果您想在不调用notifyDataSetChanged() 的情况下将项目添加到适配器,那么我建议在调用RecyclerView.setAdapter() 之前添加它们。设置Adapter 后,您对适配器数据集所做的任何进一步更改都应在调用notifyDataSetChanged() 之后进行(或者最好是更具体的notifyX() 调用之一)。

      【讨论】:

        猜你喜欢
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-25
        • 1970-01-01
        • 2022-01-13
        • 2020-04-12
        • 2013-10-03
        相关资源
        最近更新 更多