我在覆盖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未在源代码上应用断点。
答案 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
每次通话都会改变比较的最终值。似乎很合理,因为它会闪烁。
也许你想用另一种方法调用这段代码,这种方法一次又一次不会多次调用。