如何覆盖Android ListView快速滚动条的外观



我正在尝试使用FastScroll机制来实现ListView,该机制使用时间而不是a-Z

不幸的是,我似乎找不到进入FastScroller索引使用的布局的方法——它似乎决心显示一个黑色的小正方形和非常大的白色文本

我已经查看了来源:

  • http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/widget/FastScroller.java/
  • http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/widget/AbsListView.java#AbsListView

这两个似乎都表明关键的快速滚动成员变量是私有的,并且使用的资源id是固定的:

mOverlayDrawable = res.getDrawable(com.android.internal.R.drawable.menu_submenu_background);

有什么办法可以推翻这一点吗?理想情况下,我的目标是2.2。及以上。

您可以尝试使用类似于以下内容的反射:

try {
  Field scrollerField = AbsListView.class.getDeclaredField("mFastScroller"); //java.lang.reflect.Field
  scrollerField.setAccessible(true);
  FastScroller instance = scrollerField.get(listViewInstance);
  Field overlayField = instance.getClass().getDeclaredField("mOverlayDrawable");
  overlayField.setAccessible(true);
  overlayField.set(instance, yourValueHere);
} catch (Exception e) {
  Log.d("Error", "Could not get fast scroller");
}

我只是把它打出来,这样它可能会直接编译,也可能不会直接编译,但这就是我的想法。我没有检查所有版本中的字段是否调用相同,您可能需要进行调整。

最新更新