使用View.isShown显示闪烁

时间:2015-07-06 13:44:11

标签: android android-scrollview

我在覆盖onScroll方法中编码如下,以显示"新"图标。

public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    if (user.hasNewPost && !imageViewNew.isShown())
        imageViewNew.setVisibility(View.VISIBLE);
    else   
        imageViewNew.setVisibility(View.INVISIBLE);
}

当我使用imageViewNew方法时,我很难理解为什么isShown()会闪烁。我删除了isShown()方法,它在onScroll事件期间提供了稳定的可见性。

我打印了Log.d(TAG, String.valueOf(imageViewNew.isShown()));,并且在每个滚动事件中都相应地给出了true / false,如下所示。

07-06 22:47:10.132    6831-6831/com.sample D/TestViewFragment﹕ false
07-06 22:47:10.192    6831-6831/com.sample D/TestViewFragment﹕ true
07-06 22:47:10.242    6831-6831/com.sample D/TestViewFragment﹕ false
07-06 22:47:10.302    6831-6831/com.sample D/TestViewFragment﹕ true

怎么可能发生?
请注意,它发生在2.3.6到5.0.1之间,因此可能与设备无关。

以下代码是View.isShown()中的android.view方法。

public boolean isShown() {
    View current = this;
    //noinspection ConstantConditions
    do {
        if ((current.mViewFlags & VISIBILITY_MASK) != VISIBLE) {
            return false;
        }
        ViewParent parent = current.mParent;
        if (parent == null) {
            return false; // We are not attached to the view root
        }
        if (!(parent instanceof View)) {
            return true;
        }
        current = (View) parent;
    } while (current != null);

    return false;
}

我无法检查哪一行返回false,因为我的Android Studio未在源代码上应用断点。

1 个答案:

答案 0 :(得分:0)

  

“当我使用isShown()方法时,我很难理解为什么imageViewNew会闪烁”

onScroll方法连续多次调用,所以让我们看一下处理“堆栈”:

onScroll -> !isShown == true -> 
              setVisibility(View.VISIBLE); // next call !isShow will be false
onScroll -> !isShown == false -> 
              setVisibility(View.INVISIBLE); // next call !isShow will be true
onScroll -> !isShown == true -> 
              setVisibility(View.VISIBLE); // next call !isShow will be false
onScroll -> !isShown == false -> 
              setVisibility(View.INVISIBLE); // next call !isShow will be true

每次通话都会改变比较的最终值。似乎很合理,因为它会闪烁。

也许你想用另一种方法调用这段代码,这种方法一次又一次不会多次调用。