Android - 在Recyclerview

时间:2017-07-01 10:10:28

标签: android memory-leaks android-recyclerview

我在我的应用中显示以下错误时出现问题:

" E / WindowManager:android.view.WindowLeaked:Activity com.awt.myapp.MyList已泄露窗口android.widget.PopupWindow $ PopupDecorView {84fdb1f VE ..... .......最初添加的D 0,0-369,120} ......"

基本上我有一个recyclerview,并且在适配器中我在每一行都有一堆textview,并且绑定点击监听器,因为单击其中一个textview会弹出一个弹出窗口。问题是,如果我在弹出窗口仍然可见时点击Android后退按钮,则会出现上述错误。

据我所知,在我的活动中持有recyclerview,我可以添加一个' onBackPressed()'方法,但从这里我不知道如何获得对适配器中任何弹出窗口的引用(并在此阶段关闭它),因为我认为这是我需要做的。

下面是我的点击监听器代码,我已经尝试了一些选项,并且使用setFocusable只会导致后退按钮停止工作,因此不确定是否需要。

tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View moreInfoView) {

                myPopupWindow.setBackgroundDrawable(new ColorDrawable());
                //myPopupWindow.setFocusable(true);
                myPopupWindow.setTouchable(false);    // Ignores taps
                myPopupWindow.setOutsideTouchable(true);  // Disappear when tapping anywhere on screen
                int position = -tv.getHeight();
                myPopupWindow.showAsDropDown(tv, 0, position); 
                ((MyList) context).onToggleMoreInfo("show");
                myPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
                    @Override
                    public void onDismiss() {
                        ((MyList) context).onToggleMoreInfo("hide");
                    }
                });                  
            }
        });

希望这是有道理的,如果您需要更多信息,请告诉我。任何建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果在适配器上创建一个实现活动的侦听器并在单击该项时调用它,则可以将弹出窗口逻辑导出到activity并在后退时覆盖以对其进行调整。

答案 1 :(得分:0)

在退出Activity之前,您应该在任何生命周期回调中忽略弹出窗口(myPopupWindow),例如:在onPause()或onDestroy()中。

相关问题