Showcaseview 库多次调用 Recyclerview 的第一项
Showcaseview library calling multiple times on Recyclerview's first item
我在我的代码中使用 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);
}
}
});
如何避免出现多个弹出窗口?
如 OnGlobalLayoutListener
的 documentation 所述:
to be invoked when the global layout state or the visibility of views within the view tree changes.
这就是为什么您的展示浏览量如此之多。每次 ViewTree 改变,你生成 showcase.
您不需要 ViewTreeObserver
和 GlobalLayoutListener
。
移动
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);
}
}
});
我在我的代码中使用 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);
}
}
});
如何避免出现多个弹出窗口?
如 OnGlobalLayoutListener
的 documentation 所述:
to be invoked when the global layout state or the visibility of views within the view tree changes.
这就是为什么您的展示浏览量如此之多。每次 ViewTree 改变,你生成 showcase.
您不需要 ViewTreeObserver
和 GlobalLayoutListener
。
移动
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);
}
}
});