Showcaseview 库多次调用 Recyclerview 的第一项

Showcaseview library calling multiple times on Recyclerview's first item

我在我的代码中使用 https://github.com/florent37/TutoShowcase 这个 showcaseview 库。

它在 activityfragment 中工作正常。但是当我调用 recyclerview 项目时,它显示多个弹出窗口并停电。

mRecyclerViewList.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Logger.log("Call");

                    TextView textView = (TextView) mRecyclerViewList.getChildAt(0).findViewById(R.id.txt_add_tocart_btn);
                    Logger.log("Textview" + textView);
                    textView.setFocusableInTouchMode(true);
                    TutoShowcase.from((Activity) context).setContentView(R.layout.tuto_showcase_tuto_sample)
                            .setFitsSystemWindows(true).on(textView).addRoundRect(35).showOnce("1").show();
                    // unregister listener (this is important)
                    if (Build.VERSION.SDK_INT < 16) {
                        mRecyclerViewList.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    } else {
                        mRecyclerViewList.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    }
                }
            });

如何避免出现多个弹出窗口?

OnGlobalLayoutListenerdocumentation 所述:

to be invoked when the global layout state or the visibility of views within the view tree changes.

这就是为什么您的展示浏览量如此之多。每次 ViewTree 改变,你生成 showcase.

您不需要 ViewTreeObserverGlobalLayoutListener

移动

TutoShowcase.from
例如

onViewCreated

您的问题是如何避免出现多个弹出窗口:

只要设置一个布尔值就可以避免多次显示。

boolean isShown = false;

mRecyclerViewList.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Logger.log("Call");
                    if(!isShown){
                      TextView textView = (TextView) mRecyclerViewList.getChildAt(0).findViewById(R.id.txt_add_tocart_btn);
                      Logger.log("Textview" + textView);
                      textView.setFocusableInTouchMode(true);
                      TutoShowcase.from((Activity) context).setContentView(R.layout.tuto_showcase_tuto_sample)
                            .setFitsSystemWindows(true).on(textView).addRoundRect(35).showOnce("1").show();
                       isShown = true;
                     }
                    // unregister listener (this is important)
                    if (Build.VERSION.SDK_INT < 16) {
                        mRecyclerViewList.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    } else {
                        mRecyclerViewList.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    }
                }
            });