Android ListView fastScrollThumbDrawable无法工作

Android ListView fastScrollThumbDrawable无法工作,android,listview,fastscroll,Android,Listview,Fastscroll,我正在做一个应用程序,我希望我的listview上的fastscroll选项卡是一个自定义的thumb选项卡。在线阅读文档时,我认为这样做可以: <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:drawSelectorOnTop="false" android:cacheColorHint="@colo

我正在做一个应用程序,我希望我的listview上的fastscroll选项卡是一个自定义的thumb选项卡。在线阅读文档时,我认为这样做可以:

<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:drawSelectorOnTop="false"
android:cacheColorHint="@color/myWhite"
android:scrollbars="vertical"
android:scrollbarThumbVertical="@drawable/scrollthumb"
android:scrollbarSize="12dip"
android:fastScrollThumbDrawable="@drawable/scrollbar_thumb"
android:fastScrollEnabled="true"
/>

列表视图正常,自定义滚动条颜色正常,fastscrollbar选项卡显示,但它使用的是默认的thumb图像,而不是png文件scrollbar\u thumb

拇指图像是否需要采用特定的格式或大小? 是否可以将其更改为自定义图形,如果不可以,则至少可以更改拇指的颜色


任何帮助都将不胜感激

请注意,
android:fastScrollThumbDrawable
属性仅适用于android API 11级及更高级别


在ListView XML定义中,添加

android:fastScrollEnabled="true"
还是用代码

listView.setFastScrollEnabled(true);
在res/drawable文件夹中创建文件fastscroll_thumb.xml,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/fastscroll_pressed" />
    <item android:drawable="@drawable/fastscroll" />
</selector>
<resources>
    <style name="ApplicationTheme">
        <item name="android:fastScrollThumbDrawable">@drawable/fastscroll_thumb</item>
    </style>
</resources>

在AndroidManifest.xml中,为应用程序设置自定义主题:

<application
    android:theme="@style/ApplicationTheme"
    ...>

在res文件夹中创建一个values文件夹。按如下方式在res/values中创建themes.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/fastscroll_pressed" />
    <item android:drawable="@drawable/fastscroll" />
</selector>
<resources>
    <style name="ApplicationTheme">
        <item name="android:fastScrollThumbDrawable">@drawable/fastscroll_thumb</item>
    </style>
</resources>

@可拉拔/快速滚动\u拇指

最后,确保fastscroll.png和fastscroll_pressed.png存在于您的drawable文件夹中

我使用的是android:fastscroll ThumbDrawable,但我不知道为什么它不起作用,所以在web上搜索时,我找到了一个硬代码解决方案,我不知道它是否适用于旧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();
}
试试看{
字段f=AbsListView.class.getDeclaredField(“mFastScroller”);
f、 setAccessible(true);
对象o=f.get();
f=f.getType().getDeclaredField(“mThumbDrawable”);
f、 setAccessible(true);
可提取可提取=(可提取)f.get(o);
drawable=getResources().getDrawable(R.drawable.);
f、 组(o,可牵引);
}捕获(例外e){
e、 printStackTrace();
}

要更改fastscroll
快速滚动ThumbDrawable
、fastScrollTrackDrawable或fastscroll
分段索引器的文本颜色,必须使用上下文主题。其他答案建议通过
AndroidManifest
覆盖应用程序的主题。这确实有效,但如果您希望每个
ListView
显示不同的滚动条,则不能这样做。此外,在应用程序主题中不应更改
SectionIndexer
上的文本颜色,因为这可能会产生其他不需要的效果

为快速滚动设置
列表视图
样式的最佳方法是创建一个自定义
列表视图
,该视图使用
上下文主题包装器

以下是一个例子:

public class FastscrollThemedListView extends ListView {
    public FastscrollThemedListView(Context context, AttributeSet attrs) {
        super(new ContextThemeWrapper(context, R.style.FastScrollTheme), attrs);
    }
}
这就是你所需要的。您的风格将如下所示:

<style name="FastScrollTheme">
    <item name="android:textColorPrimary">?android:textColorPrimaryInverse</item>
    <item name="android:fastScrollThumbDrawable">@drawable/fast_scrollbar_thumb</item>
    <item name="android:fastScrollTrackDrawable">@drawable/fast_scrollbar_track</item>
</style>
<com.yourapp.view.FastscrollThemedListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:drawSelectorOnTop="false"
    android:cacheColorHint="@color/myWhite"
    android:scrollbars="vertical"
    android:scrollbarSize="12dip"
    android:fastScrollEnabled="true"/>

我测试了前面的答案,并提出了这个简化版本,其中包含用于快速滚动的自定义拇指图标的最低要求:

Android清单:(应用程序标签)

android:theme=“@style/applicationteme”

res/values/themes.xml:

<resources>
  <style name="ApplicationTheme">
    <item name="android:fastScrollThumbDrawable">@drawable/scrollbar</item>
  </style>
</resources>

@可绘制/滚动条
布局\活动\ u main.xml: (或在您的视图中希望应用此功能的任何位置启用快速滚动(&E)) 添加此属性:


我的在ICS中仍然什么都不做。我必须在我的应用程序中应用一个主题,才能获得定制的快速滚动条。@sgarman,你能解释一下(也许作为回答?)你在应用程序中应用一个主题以获得定制的快速滚动条是什么意思吗?我喜欢你清晰的解释。我不明白为什么我需要在AndroidManifest中设置android:theme,而不是在LinearLayout元素中设置另一个布局文件。在为其编写的android版本中,更改快速滚动缩略图的唯一方法是使用应用程序主题在整个应用程序中设置它。在更新版本的android中,可以将其设置为线性布局,但我必须检查一下,然后再与您联系。我已经按照此过程进行了操作,但我仍然无法更改fastScrollThumbDrawable。