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

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

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

Просмотр списка виджетов Android в верхней части экрана прокрутки

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

Solutions Collecting From Web of "Верхняя подсветка ListView при прокрутке"

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

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

 <ListView android:overScrollMode="never" /> 

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

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

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

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

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

  1. setOverscrollFooter(null) и setOverscrollHeader(null) не работает. По крайней мере, на 2.3. *. Установка атрибутов из * .xml тоже не помогает.
  2. 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()); } } 

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

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

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

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

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

Редакция:

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

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

Я использовал ответ Корда, пока он не прекратил работать в 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; } } 

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

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