【发布时间】:2013-02-17 16:05:17
【问题描述】:
通过根据行号(在适配器的 getView() 中)设置文本框的颜色,我为 ListView 中的不同行设置了不同的颜色。现在,当我手动向上滚动 ListView 时,正确的颜色会显示在显示的底行中。但是当我使用 scrollTo 时,这不会发生,所有显示的行都有相同的颜色(它们没有更新)。
有人遇到过这个问题吗?这似乎令人费解!
【问题讨论】:
通过根据行号(在适配器的 getView() 中)设置文本框的颜色,我为 ListView 中的不同行设置了不同的颜色。现在,当我手动向上滚动 ListView 时,正确的颜色会显示在显示的底行中。但是当我使用 scrollTo 时,这不会发生,所有显示的行都有相同的颜色(它们没有更新)。
有人遇到过这个问题吗?这似乎令人费解!
【问题讨论】:
ListView#scrollTo 不滚动列表内容。 (这是一种标准的 View 方法,根本不特定于列表:它会滚动 ListView 视图本身。)
请尝试使用ListView#setSelectionFromTop(0, int y) 滚动。
如果您正在为 KitKat 及更高版本编程,API 19+ 有一个 ListView#scrollListBy(int y) 方法。
【讨论】:
setSelectionFromTop(int posittion, int y),ListView 将移至列表顶部。 y 值是距该 ListView 项顶部边缘的距离。 (您可能必须否定您的 y 值。)
setSelectionFromTop(int posittion, int y) 的位置设为0,但无论y 的值如何,列表都保持在第一个位置(不滚动)......
在我们的项目中ListView#setSelectionFromTop(0, int y) 没有任何作用。所以我们以兼容的方式破解了这个:
class Hacks {
static {
Method trackMotionScroll = null;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
try {
trackMotionScroll = AbsListView.class
.getDeclaredMethod("trackMotionScroll", int.class, int.class);
trackMotionScroll.setAccessible(true);
} catch (NoSuchMethodException e) {
Exceptions.crash(e);
}
}
listViewTrackMotionScroll = trackMotionScroll;
}
public static void scrollListBy(ListView listView, int y) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
listView.scrollListBy(y);
} else {
try {
listViewTrackMotionScroll.invoke(listView, -y, -y);
} catch (Exception e) {
Exceptions.crash(e);
}
}
}
}
【讨论】: