设想一下,当ListView的页面超过50页或者更多时,要想从40页移动10页的时候手动滑动是很费时的事情,用户体验不好,此时ListView/GridView的android:fastScrollEnabled属性就起到了作用
具体使用方法就是控件增加一个属性即可
<ListView android:id="@+id/main_listview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:fastScrollEnabled="true"/>
但是Android提供的快速滑动块是一个竖条,如果想要更改,系统没有提供直接更改的方法,此时使用反射机制进行更改
使用时调用以下方法即可方法如下:
/** * @param 控件 * @param 要变更的图片drawable文件
* @return 更改成功返回true
*/ public static boolean setFastScrollThumbImage(AbsListView listView, Drawable thumb) { try { Field field; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { //getDeclaredField("mFastScroll");获取指定名字的成员变量 field = AbsListView.class.getDeclaredField("mFastScroll"); } else { field = AbsListView.class.getDeclaredField("mFastScroller"); } //true 表示field在使用时应该取消 Java 语言访问检查。 field.setAccessible(true); Object obj = field.get(listView); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { //field.getType();返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型 field = field.getType().getDeclaredField("mThumbImage"); field.setAccessible(true); ImageView iv = (ImageView) field.get(obj); iv.setImageDrawable(thumb); } else { field = field.getType().getDeclaredField("mThumbDrawable"); field.setAccessible(true); Drawable drawable = (Drawable) field.get(obj); drawable = thumb; field.set(obj, drawable); } return true; } catch (Exception ignored) { } return false; }
效果图: