Android 如何从RecyclerView';在释放视图持有者时,它们是什么?

Android 如何从RecyclerView';在释放视图持有者时,它们是什么?,android,android-recyclerview,onclicklistener,Android,Android Recyclerview,Onclicklistener,我在我的应用程序项目中使用RecyclerViews,并将OnClickListeners与它们的viewHolder一起设置(在它们的构造函数中,如StackOverflow中所述) 然后我有一个问题:当OnClickListeners被释放时,如何从RecyclerView的视图持有者中删除它们。 通常,我们可以通过以下操作删除OnClick侦听器: view.setOnClickListener(null); 如果它是ViewPager的PagerAdapter,我们可以在destroy

我在我的应用程序项目中使用RecyclerViews,并将OnClickListeners与它们的viewHolder一起设置(在它们的构造函数中,如StackOverflow中所述)

然后我有一个问题:当OnClickListeners被释放时,如何从RecyclerView的视图持有者中删除它们。

通常,我们可以通过以下操作删除OnClick侦听器:

view.setOnClickListener(null);
如果它是ViewPager的PagerAdapter,我们可以在
destroyItem
方法中这样做

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    View view = container.findViewById(R.id.viewId);
    view.setOnClickListener(null);
}

我在哪里可以使用RecyclerView这样做--或者,我不需要这样做?

如果您正在使用
RecyclerView
并将
OnClickListener
绑定到它的每一行根视图,则无需处理它们


但是,如果某些视图不应响应click事件,只需使用
setOnClickListener(null)

如果要在视图离开屏幕时将RecyclerView.Adapter视图的onCLickListener()设置为null,可以通过覆盖RecyclerView适配器中的来实现。您将收到刚从屏幕上消失的holder作为参数。您可以将该保持架中任何可用视图的onClickListener设置为null

或者,如果您只想在屏幕上显示时执行相同的操作,则可以在onBindViewHolder()中执行。但这没有意义,因为您可以避免设置listener

与此答案相关的记住要点:
当您不想将click listener设置为查看每个数据集(但仅限于少数数据集)时,可能需要将listener设置为null。在这种情况下,最好在listenrs离开屏幕时将其设置为null。否则,as RecyclerView将重新使用(回收)已离开的holder对象,以表示即将可见的新数据集。在此过程中,未将侦听器设置为的数据集(支架中的视图)可能会因为循环而设置侦听器


总而言之,在利用循环使用带来的平滑滚动优势的同时,开发人员有责任重置视图(清除图像视图、文本视图等)并设置onCLickListener等为null。

我认为您不需要将click listener设置为null。在释放视图时,垃圾回收器应拾取回调。另外,如果我们希望这样做,我希望会出现removeOnClicklistener方法。在调用onViewDetachedFromWindow(VH)时,我尝试删除作为观察者的ViewHolder。但我观察到一个错误行为,即对屏幕上的极端项目启动回调,即使它们是可见的。因此,我改用了onViewRecycled(VH)。您确定要使用的正确对是
onViewDetachedFromWindow
onBindViewHolder
?。如果视图与窗口分离,则不一定意味着它已“释放”。正确的对应该是onViewRecycled`
onBindViewHolder
,如开发人员页面()