通过根据行号(在适配器的 getView() 中)设置文本框的颜色,我为 ListView 中的不同行设置了不同的颜色。现在,当我手动向上滚动 ListView 时,正确的颜色会显示在显示的底行中。但是当我使用 scrollTo 时,这不会发生,所有显示的行都具有相同的颜色(它们没有更新)。
有人遇到过这个问题吗?这似乎令人费解!
通过根据行号(在适配器的 getView() 中)设置文本框的颜色,我为 ListView 中的不同行设置了不同的颜色。现在,当我手动向上滚动 ListView 时,正确的颜色会显示在显示的底行中。但是当我使用 scrollTo 时,这不会发生,所有显示的行都具有相同的颜色(它们没有更新)。
有人遇到过这个问题吗?这似乎令人费解!
ListView#scrollTo
不滚动列表内容。(这是一种标准的 View 方法,根本不特定于列表:它会滚动 ListView 视图本身。)
相反,请尝试使用ListView#setSelectionFromTop(0, int y)
滚动。
ListView#scrollListBy(int y)
如果您正在为 KitKat 及更高版本编程,API 19+ 有一个方法。
在我们的项目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);
}
}
}
}