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

Android 如何从RecyclerView.LayoutManager中获取当前的RecyclerView.Adapter?,android,android-layout,android-arrayadapter,recyclerview-layout,Android,Android Layout,Android Arrayadapter,Recyclerview Layout,RecyclerView的LayoutManager类定义了一个名为onAdapterChanged()的函数。如果在已连接LayoutManager时调用RecyclerView.setAdapter(),则会按预期调用LayoutManager.onAdapterChanged() 但是,如果在附加LayoutManager之前调用RecyclerView.setAdapter(),onAdapterChanged()不会在附加时触发,这意味着延迟附加的LayoutManager似乎没有办法

RecyclerView
LayoutManager
类定义了一个名为
onAdapterChanged()
的函数。如果在已连接
LayoutManager
时调用
RecyclerView.setAdapter()
,则会按预期调用
LayoutManager.onAdapterChanged()

但是,如果在附加
LayoutManager
之前调用
RecyclerView.setAdapter()
onAdapterChanged()
不会在附加时触发,这意味着延迟附加的
LayoutManager
似乎没有办法获取当前附加的适配器

这让我很惊讶,因为我认为它会调用它,为
oldapter
传递“null”,但事实并非如此


因此,除非将适配器显式传递给
LayoutManager
我们自己,否则当前API中是否有任何东西会将当前
adapter
暴露给
LayoutManager

好的,我有一个可行的解决方案
LayoutManager
定义了
onAttachedToWindow()
,顾名思义,当
RecyclerView
打开
LayoutManager
并将其连接到
窗口时,将调用该函数。该方法的唯一参数是所附加的
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;
}
如果您有需要(可能是清理等),也可以添加以下内容:


这样,当您使用布局代码时,就可以保证始终使用当前(如果有)的适配器。

好的,我有一个可行的解决方案
LayoutManager
定义了
onAttachedToWindow()
,顾名思义,当
RecyclerView
打开
LayoutManager
并将其连接到
窗口时,将调用该函数。该方法的唯一参数是所附加的
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;
}
如果您有需要(可能是清理等),也可以添加以下内容:


这样,您就可以始终保证具有当时的电流(如果有)进入布局代码时使用适配器。

您可以尝试的是,正如您在评论中提到的那样,收听
OnAttachedToWindow
并从从那里传入的回收视图中读取适配器,然后您可以在
onAdapterChanged
中收听适配器更改

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


如果以其他方式解决了此问题,或者无法从中检索适配器,您提出的第一种方法肯定有效。

您可以尝试的是,正如您在评论中提到的那样,收听
OnAttachedToWindow
并从从从那里传入的回收视图中读取适配器,然后您可以在
onAdapterChanged
中收听适配器更改

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


如果解决了这个问题,或者无法从中检索到适配器,那么您提出的第一种方法肯定会起作用。

难道您不能将适配器作为构造函数中的参数传递给布局管理器吗?正如我所说,我正在寻找不需要的东西。可以在布局文件中设置LayoutManager,这样就不适用了。我认为解决方案是在onAdapterChanged和OnAttachedToWindow中都使用它,后者是RecyclerView(这样你就可以在那里使用它了。)我喜欢人们投票否决那些a)有效的问题,b)完全没有反馈的事情。真烦人。绝对不是S/O的朋友!这不是苏的问题,而是人的问题。一个人无缘无故地点击“投票否决”按钮有什么用?对,没有。不,我的意思是他们肯定不是的朋友,因为他们不知道它的用途。。。询问和回答问题,并就不同的方法提供建议。没有至少一条评论的否决票不能实现上述任何一点。你不能将适配器作为构造函数中的参数传递给布局管理器吗?正如我所说,我正在寻找不需要它的东西。可以在布局文件中设置LayoutManager,这样就不适用了。我想不是