RecyclerView
的{{1}}类定义了一个名为LayoutManager
的函数。如果您在已添加onAdapterChanged()
时致电RecyclerView.setAdapter()
,则会按预期调用LayoutManager
。
但是,如果您在 之前致电LayoutManager.onAdapterChanged()
,则会附上RecyclerView.setAdapter()
,LayoutManager
不会当你附加它时会发射 ,这意味着后期附加的onAdapterChanged()
似乎没有办法获得当前连接的适配器。
这让我感到惊讶,因为我认为它会调用它,为LayoutManager
传递'null',但事实并非如此。
因此,除了明确地将适配器传递给oldAdapter
之类的内容之外,当前API中是否存在将当前LayoutManager
公开给Adapter
的内容?
答案 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说“查找代表给定适配器位置的视图”,所以我假设他们可以访问那里的适配器,所以你可以像在那里那样完成适配器。
如果这样解决了,或者无法从那里检索适配器,那么你提出的第一种方法肯定有效。