如何从RecyclerView.LayoutManager中获取当前的RecyclerView.Adapter?

时间:2017-10-17 21:41:26

标签: android android-layout android-arrayadapter recyclerview-layout

RecyclerView的{​​{1}}类定义了一个名为LayoutManager的函数。如果您在已添加onAdapterChanged()时致电RecyclerView.setAdapter(),则会按预期调用LayoutManager

但是,如果您在 之前致电LayoutManager.onAdapterChanged() ,则会附上RecyclerView.setAdapter()LayoutManager 不会当你附加它时会发射 ,这意味着后期附加的onAdapterChanged()似乎没有办法获得当前连接的适配器。

这让我感到惊讶,因为我认为它会调用它,为LayoutManager传递'null',但事实并非如此。

因此,除了明确地将适配器传递给oldAdapter之类的内容之外,当前API中是否存在将当前LayoutManager公开给Adapter的内容?

2 个答案:

答案 0 :(得分:1)

好的,我有一个可行的解决方案。 LayoutManager定义了onAttachedToWindow(),正如其名称所暗示的那样,RecyclerView LayoutManager设置为Window时会调用RecyclerView。该方法的唯一参数是附加的getAdapter()实例。使用它,您只需调用LayoutManager并根据需要存储结果。

要在设置onAdapterChanged()后跟踪更改,请使用上述问题中提到的onDetachedFromWindow

最后,为了完整性,如果您对它进行分离时感兴趣,也可以覆盖private RecyclerView.Adapter adapter; @Override public void onAttachedToWindow(RecyclerView recyclerView){ super.onAttachedToWindow(recyclerView); this.adapter = recyclerView.getAdapter(); } @Override public void onAdapterChanged(RecyclerView.Adapter oldAdapter, RecyclerView.Adapter newAdapter){ super.onAdapterChanged(oldAdapter, newAdapter); this.adapter = newAdapter; } ,但如果是,则无论如何都不会触发布局代码,因此不确定此部分是否必要。

这是相关的比特......

@Override public void onDetachedFromWindow(RecyclerView recyclerView, Recycler recycler)
{
    super.onDetachedFromWindow(recyclerView, recycler);

    this.adapter = null;
}

如果您有需要(可能需要清理等等),您也可以添加它:

cordova platfom is

这样,当你到达布局代码时,你始终可以保证有当前的(如果有的话)适配器。

答案 1 :(得分:0)

你可以尝试的是正如你在评论中提到的那样,听取OnAttachedToWindow并从那里传入的RecyclerView中读取适配器,然后你可以在onAdapterChanged中监听适配器的变化。 / p>

但您可以尝试使用Android Studio Decompiler查看findViewByPosition的源代码(我不能这样做因为我在手机上),看看他们是如何做到的。该方法的javadoc说“查找代表给定适配器位置的视图”,所以我假设他们可以访问那里的适配器,所以你可以像在那里那样完成适配器。

如果这样解决了,或者无法从那里检索适配器,那么你提出的第一种方法肯定有效。