快速滚动自定义拇指

5
如何在ListView中设置自定义缩略图以进行快速滚动。
5个回答

7

你可以将这个设置写入style.xml文件中

<style name="Theme_app" parent="@android:style/Theme.Holo.Light">
    <item name="android:fastScrollThumbDrawable">@drawable/fastscroll_thumb_holo</item>

 </style>

在Drawable中创建一个XML文件来存储图片。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/fastscroll_thumb_pressed_holo" />
    <item android:drawable="@drawable/fastscroll_thumb_default_holo" />
</selector>

5

从样式中设置Drawable是最好的方法。但是,如果您希望以编程方式实现此操作,这里有两种方法可能会有用:

/**
 * Set a ListView or GridView fast scroll thumb image.
 * 
 * @param listView The {@link android.widget.ListView} or {@link android.widget.GridView}
 * @param thumb The fast-scroll drawable
 * @return {@code true} if successfully set.
 */
public static boolean setFastScrollThumbImage(AbsListView listView, Drawable thumb) {
    try {
        Field f;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            f = AbsListView.class.getDeclaredField("mFastScroll");
        } else {
            f = AbsListView.class.getDeclaredField("mFastScroller");
        }
        f.setAccessible(true);
        Object o = f.get(listView);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
            f = f.getType().getDeclaredField("mThumbImage");
            f.setAccessible(true);
            ImageView iv = (ImageView) f.get(o);
            iv.setImageDrawable(thumb);
        } else {
            f = f.getType().getDeclaredField("mThumbDrawable");
            f.setAccessible(true);
            Drawable drawable = (Drawable) f.get(o);
            drawable = thumb;
            f.set(o, drawable);
        }
        return true;
    } catch (Exception ignored) {
    }
    return false;
}

/**
 * Set a ListView or GridView fast scroll thumb color.
 * 
 * @param listView The {@link android.widget.ListView} or {@link android.widget.GridView}
 * @param color The color for the fast-scroll thumb
 * @return {@code true} if successfully set.
 */
public static boolean setFastScrollThumbColor(AbsListView listView, int color) {
    try {
        Field f;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            f = AbsListView.class.getDeclaredField("mFastScroll");
        } else {
            f = AbsListView.class.getDeclaredField("mFastScroller");
        }
        f.setAccessible(true);
        Object o = f.get(listView);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
            f = f.getType().getDeclaredField("mThumbImage");
            f.setAccessible(true);
            ImageView iv = (ImageView) f.get(o);
            iv.setColorFilter(color, android.graphics.PorterDuff.Mode.SRC_ATOP);
        } else {
            f = f.getType().getDeclaredField("mThumbDrawable");
            f.setAccessible(true);
            final Drawable drawable = (Drawable) f.get(o);
            drawable.setColorFilter(color, android.graphics.PorterDuff.Mode.SRC_ATOP);
        }
        return true;
    } catch (Exception ignored) {
    }
    return false;
}

1
在Android Kitkat中进行硬编码(FastScroller(Android Kitkat)中的“mThumbDrawable”字段不存在)
try {
            java.lang.reflect.Field f = AbsListView.class.getDeclaredField("mFastScroller");
            f.setAccessible(true);
            Object o = f.get(root.findViewById(R.id.beam_contact_listview));
            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                f = f.getType().getDeclaredField("mThumbImage");
            } else {
                f = f.getType().getDeclaredField("mThumbDrawable");
            }
            f.setAccessible(true);
            Drawable drawable = (Drawable) f.get(o);
            drawable = getResources().getDrawable(R.drawable.sv_fastscroll);
            f.set(o, drawable);
        } catch (Exception e) {
            e.printStackTrace();
        }

1
mThumbImage在KitKat+上不是Drawable,而是ImageButton。 - Jared Rummler

0

如果您查看Android 2.2r1(修订版1)的源代码,会发现有一个名为android.widget.FastScroller的类,其中包含方法useThumbDrawable()

我刚刚从一个名为MobileBytes的博客下载了该源代码,您可以将其导入到您的项目中并实现它?(或者将您的API升级到2.2 r1)


0

我正在使用android:fastScrollThumbDrawable,但我不知道为什么它不起作用,所以在网上搜索时我找到了这里一个硬编码的解决方案。我不知道它是否适用于旧的API,但在我的情况下问题得到了解决。请注意,我将API 18作为目标,并使用API 17的设备进行测试。

代码如下:

try {
    Field f = AbsListView.class.getDeclaredField("mFastScroller");
    f.setAccessible(true);
    Object o = f.get(<<your listView here>>);
    f = f.getType().getDeclaredField("mThumbDrawable");
    f.setAccessible(true);
    Drawable drawable = (Drawable) f.get(o);
    drawable = getResources().getDrawable(R.drawable.<<your thumb drawable here can be a selector>>);
    f.set(o, drawable);
} catch (Exception e) {
    e.printStackTrace();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接