Android ListView fastScrollThumbDrawable не работает

Я делаю приложение, в котором я хочу, чтобы вкладка быстрой прокрутки в моем списке была настраиваемой вкладкой большого пальца. читая документы онлайн я думал, что это сделает это:

<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"
/>

Список в порядке, пользовательские цвета полосы прокрутки работают, и отображается вкладка панели прокрутки, но используется изображение большого пальца по умолчанию, а не файл png scrollbar_thumb.

изображение большого пальца должно быть в определенном формате или размере? можно ли изменить его на пользовательский рисунок, если нет, то по крайней мере можно изменить цвет большого пальца?

Любая помощь будет высоко ценится

5 ответов

В определении XML ListView добавьте

android:fastScrollEnabled="true"

или в коде

listView.setFastScrollEnabled(true);

Создайте файл fastscroll_thumb.xml в папке res/drawable следующим образом:

<?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>

В AndroidManifest.xml установите собственную тему для своего приложения:

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

Создайте папку значений в папке res. Создайте файлы themes.xml в res/values ​​следующим образом:

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

Наконец, убедитесь, что fastscroll.png и fastscroll_pressed.png существуют в вашей папке для рисования

Я использую 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();
}

Я проверил предыдущие ответы и придумал эту упрощенную версию с минимальными требованиями для пользовательского значка большого пальца для быстрой прокрутки:

Манифест Android: (тег приложения)

android:theme="@style/ApplicationTheme"

Рез / значения / themes.xml:

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

layout \ activity_main.xml: (или там, где, по вашему мнению, вы хотите применить это и включить быструю прокрутку), ДОБАВЬТЕ следующее:

<ListView android:fastScrollEnabled="true" />

Для того, чтобы изменить fastScrollThumbDrawable, fastScrollTrackDrawableили цвет текста быстрой прокрутки SectionIndexer Вы должны использовать тему контекста. Другие ответы рекомендуют переопределить тему приложения через AndroidManifest сделать это. Это работает, но если вы хотите, чтобы в зависимости от ListView ты не можешь сделать это. Кроме того, как вы меняете цвет текста на SectionIndexer не должно быть сделано в вашей теме приложения, потому что это может иметь другие нежелательные эффекты.

Лучший способ стилизовать ListView для быстрого прокрутки это создать кастом ListView который использует ContextThemeWrapper,

Вот пример:

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>

textColorPrimary как вы цепляетесь, как вы цепляетесь в SectionIndexer цвет шрифта, если вы используете его.

Ваш ListView будет выглядеть так:

<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:fastScrollThumbDrawable Атрибут применяется только для Android API уровня 11 и выше.

http://developer.android.com/reference/android/R.attr.html

Другие вопросы по тегам