微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – RecyclerView.Adapter onViewDetachedFromWindow从未调用过

如果我希望我的ViewHolders在RecyclerView中清理内部状态(在这种情况下从EventBus取消注册并清理Rx-Subscriptions),那么该怎么办?
我认为适配器上的onViewDetachedFromWindow或onViewRecycled方法是我可以清理资源的回调(如API中所述),但是当我从带有RecyclerView的Activity更改为另一个Activity时,从不调用方法.

输入活动时只调用onViewAttachedToWindow,我可以看到我的项目.

我的适配器看起来像这样:

public class Adapter extends RecyclerView.Adapter

持有RecyclerView的Activity:

public class MyActivity extends AppCompatActivity
{

   protected void setupView()
   {
        //called in onCreate

        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new GridLayoutManager(this,3));
        this.adapter = new Adapter(new ItemViewHolderFactory());
   }

    @Override
    public void setItems(List

ViewHolder看起来像这样

public class MyViewHolder extends RecyclerView.ViewHolder
{
        public void bind(MyItem item)
        {
          //set initial data
        }

       public void viewAttached()
       {
        registerToEventBus();
        loadDataAsync(); // here an rx operation is scheduled and a subscription is hold
       }

     public void viewDetached()
     {
         unregisterFromEventBus();
         cancelAsyncoperationAndCleanSubscription();
     }
}

感谢您的任何建议.

编辑
我试图在适配器中覆盖onDetachedFromrecyclerView,但是也没有调用方法.

最佳答案
我遇到了同样的问题:

如前所述,您可以在onPause(Activity,Fragment)或onDetachFromWindow(Activity,Fragment)中设置适配器null.

recyclerview.setAdapter(null)

然后,您将获得viewDetachedFromWindow(…),您可以在其中释放内部状态和订阅.
我将在on bind中设置您的订阅,确保在每次绑定调用之前您重新关联旧订阅,因为视图可以被回收.

另一种可能性是膨胀自定义视图而不是工厂中的布局.然后,您可以在自定义视图onDetachFromWindow()中进行清理.您也可以在不将适配器设置为null的情况下获得onDetachedFromWindow.

原文地址:https://www.jb51.cc/android/430102.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐