Подтвердить что ты не робот

Верхняя подсветка ListView при прокрутке

Граница отображает цвет по умолчанию (оранжевый на моем Nexus S) при прокрутке списка ListView до предела. Как изменить этот цвет?

Я действительно не знаю, как это объяснить. Посмотрите на эту картинку:

android list view top highlight on scrolling

Итак, как изменить цвет выделения, когда ListView прокручивается до границы? используя темы или стили

4b9b3361

Ответ 1

Решение состоит в использовании setOverscrollFooter(null) и setOverscrollHeader(null). Документация здесь!

Вы также можете установить его непосредственно в XML:

<ListView android:overScrollMode="never" />

Или укажите нижний колонтитул и заголовок:

<ListView 
  android:overscrollHeader="@null" 
  android:overscrollFooter="@null" />

N.B.: Существует также свойство fadingEdge, которое может вас заинтересовать.

Поддерживаются методы Overscroll, начинающиеся с уровня API 9

Ответ 2

Наконец, я нашел решение.

  • setOverscrollFooter(null) и setOverscrollHeader(null) не работает. По крайней мере, на 2.3. *. Установка атрибутов из *.xml тоже не помогает.
  • setOverScrollMode(View.OVER_SCROLL_NEVER) вызывает глючную прокрутку. По крайней мере, на 2.3. *.

Единственное решение, которое действительно работает, связано с использованием Java Reflection. Он работает даже с уродливыми пользовательскими списками Samsung с эффектом переполнения отскока. Вот фрагмент:

@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
    //onOverScrolled method must be overrided, or we will see the background of the listview when overscroll fast.
}

private void removeOverscrollEffect() {
    try {
        Class<?> superClass = getClass().getSuperclass().getSuperclass();

        Field field = superClass.getDeclaredField("mEdgeGlowTop");
        field.setAccessible(true);
        Object edgeGlowTop = field.get(this);
        if (edgeGlowTop != null) {
            Class<? extends Object> edgeClass = edgeGlowTop.getClass();
            Field edgeDrawable = edgeClass.getDeclaredField("mEdge");
            edgeDrawable.setAccessible(true);
            edgeDrawable.set(edgeGlowTop, new ColorDrawable(Color.TRANSPARENT));
            Field glowDrawable = edgeClass.getDeclaredField("mGlow");
            glowDrawable.setAccessible(true);
            glowDrawable.set(edgeGlowTop, new ColorDrawable(Color.TRANSPARENT));
            field.set(this, edgeGlowTop);
        }

        Field fieldBottom = superClass.getDeclaredField("mEdgeGlowBottom");
        fieldBottom.setAccessible(true);
        Object edgeGlowBottom = fieldBottom.get(this);
        if (edgeGlowBottom != null) {
            Class<? extends Object> edgeClassBottom = edgeGlowBottom.getClass();
            Field edgeDrawableBottom = edgeClassBottom.getDeclaredField("mEdge");
            edgeDrawableBottom.setAccessible(true);
            edgeDrawableBottom.set(edgeGlowBottom, new ColorDrawable(Color.TRANSPARENT));
            Field glowDrawableBottom = edgeClassBottom.getDeclaredField("mGlow");
            glowDrawableBottom.setAccessible(true);
            glowDrawableBottom.set(edgeGlowBottom, new ColorDrawable(Color.TRANSPARENT));
            fieldBottom.set(this, edgeGlowBottom);
        }
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
    }
}

Надеюсь, это поможет.

Ответ 3

Вот хорошая статья о Оптимизация фона в ListView.

Чтобы устранить эту проблему, все, что вам нужно сделать, это либо отключить оптимизацию подсказок для цвета кеша, если вы используете не сплошной цвет фона, либо установите подсказку на соответствующее значение сплошного цвета. Вы можете сделать это из кода (см. SetCacheColorHint (int)) или предпочтительно из XML, используя атрибут android: cacheColorHint. Чтобы отключить оптимизацию, просто используйте transparent color #00000000. На следующем скриншоте показан список с android:cacheColorHint="#00000000"

Ответ 4

Используйте его в файле XML -

<ListView ---
     android:fadingEdge="none"
   ---</ListView>

Редакция:

Использование затухающих ребер может привести к заметным ухудшениям производительности и должно использоваться только тогда, когда это требуется визуальным дизайном приложения. Чтобы запросить края затухания с уровнем API 14 и выше, используйте вместо этого атрибут android: требуетсяFadingEdge.

Проверьте этот API ссылка

Ответ 5

Я использовал ответ kord, пока он не прекратил работать в Lollipop, поэтому я изменил на это:

try {
    Class<?> superClass = getClass().getSuperclass().getSuperclass();

    Field field = superClass.getDeclaredField("mEdgeGlowTop");
    field.setAccessible(true);
    field.set(this, new NoEdgeEffect(getContext()));

    Field fieldBottom = superClass.getDeclaredField("mEdgeGlowBottom");
    fieldBottom.setAccessible(true);
    fieldBottom.set(this, new NoEdgeEffect(getContext()));
} catch (Exception e) {
}

class NoEdgeEffect extends EdgeEffect
{
    public NoEdgeEffect(Context context) {
        super(context);
    }
    public boolean draw(Canvas canvas) {
        // Do nothing
        return false;
    }
}

Ответ 6

вы можете использовать android: listSelector = "# 002234".

В приведенном выше значении может быть любой цветовой код, который можно легко найти в Интернете.