Библиотека Showcaseview, вызывающая несколько раз первый элемент Recyclerview

Я использую https://github.com/florent37/TutoShowcase эту библиотеку showcaseview в моем коде.

Работает нормально в activity а также fragmentНо когда я звоню 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);
                    }
                }
            });

Как я могу избежать нескольких всплывающих окон?

2 ответа

Решение

Ваш вопрос, как избежать нескольких всплывающих окон:

Просто установите логическое значение, чтобы избежать многократного показа.

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);
                    }
                }
            });

Как описано в документации OnGlobalLayoutListener:

вызываться при изменении состояния глобального макета или видимости представлений в дереве представлений.

Вот почему вы получили много и много просмотров витрины. Каждый раз, когда ViewTree изменяется, вы генерируете витрину.

Вам не нужно для ViewTreeObserver а также GlobalLayoutListener,

Переехать

TutoShowcase.from

в onViewCreated например.

Другие вопросы по тегам