代码之家  ›  专栏  ›  技术社区  ›  Mojo Risin

快速滚动自定义缩略图

  •  5
  • Mojo Risin  · 技术社区  · 14 年前

    如何在ListView中设置快速滚动的自定义缩略图。

    5 回复  |  直到 10 年前
        1
  •  7
  •   douarbou    12 年前

    您可以将其设置为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>
    
        2
  •  4
  •   Jared Rummler mehmoodnisar125    10 年前

    从样式中设置可拖动是可行的。但是,如果您想以编程方式进行此操作,这里有两种方法应该是有用的:

    /**
     * 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;
    }
    
        3
  •  1
  •   xoxol_89    10 年前

    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();
            }
    
        4
  •  0
  •   HXCaine    14 年前

    如果你看一下Android2.2R1(修订版1)的源代码,有一个类叫做 android.widget.FastScroller ,它有方法 useThumbDrawable() .

    我只是 downloaded the source from a blog called MobileBytes 其中包含它,也许您可以将它导入到您的项目中并实现它?(或将API升级到2.2 R1)

        5
  •  0
  •   ademar111190    11 年前

    我用的是 android:fastScrollThumbDrawable 但我不知道为什么它不起作用,所以我在网上搜索 here 这是一个硬代码解决方案,我不知道它是否适用于旧的API,但在我的例子中解决了这个问题。注意,我正在使用API 18(类似于Target)和带有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();
    }