2014-11-27 2 views
6

Нам всем посоветовали против вложенных представлений, содержащих механизм прокрутки. Однако в последней версии Android (5.0) приложение Phone привлекло мое внимание тем, что кажется ListView внутри ScrollView.Бесшовная вложенная прокрутка (Android)

Что действительно заинтриговало меня в том, что механизм прокрутки переключился с ScrollView на ListView без проблем. Демо-версия: https://dl.dropboxusercontent.com/u/244748/recording.mp4.

Обратите внимание, что содержимое над вкладками выталкивается из вида до фактического начала прокрутки ListView.

Я пробовал дублировать это сам, но оказался неудачным. Вот основной подход, который я принимал ...

enter image description here

С одной непрерывного событием касания (без подъема пальца) ...

Как пользователь прокручивает, то ListView медленно покрывает ImageView. Как только ImageView покрыт 100%, а ListView занимает весь экран, начнет прокручиваться ListView.

Я сейчас слушаю коснуться событий на ListView и если вершина была достигнута, называют requestDisallowInterceptTouchEvent на ListView, т.е.

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    if (listViewAtTop) { 
    v.requestDisallowInterceptTouchEvent(true); 
    } else { 
    v.requestDisallowInterceptTouchEvent(false); 
    } 
    return false; 
} 

коммутационного прокрутки контекста работает, только если вы поднимите палец и продолжить прокрутку.

Есть ли другой подход, который достигнет желаемого эффекта?

ответ

0

Я нашел альтернативный «трюк», который довольно прост ... Используйте только ListView с добавленным прозрачным заголовком.

8

Android 5.0 Lollipop (API 21) добавил вложенную поддержку прокрутки.

Из того, что я могу сказать, как ListView (AbsListView), так и ScrollView поддерживают это сейчас (если выполняется на API 21), но он должен быть включен в прокручиваемых представлениях.

Есть два способа, с помощью вызова setNestedScrollingEnabled(true) или с макетом атрибут андроид: nestedScrollingEnabled = «истина» (которая без документов)

Чтобы узнать о том, как это работает, или для поддержки этого для пользовательского виджета, основные методы таковы:

К сожалению, нет никакого руководства или обучения, который объясняет, как это работает, кроме самого JavaDoc, который является довольно свет, и нет никаких примеров кроме ScrollView.

1

При попытке выяснить, как решить эту проблему самостоятельно, я сначала нашел этот вопрос; однако ответ на самом деле не стал слишком подробным. Я нашел много хороших ресурсов, поэтому, если кто-то еще найдет это, я свяжу их ниже. Термин для этого эффекта - «Sticky Scrolling».


Статья, говорящая о «Синхронизированной прокрутке».

http://www.pushing-pixels.org/2011/07/18/android-tips-and-tricks-synchronized-scrolling.html


Хорошее видео демонстрации некоторых Android прокрутка трюков, "Быстрый возврат" и "Sticky Scrolling".

https://www.youtube.com/watch?v=PL9s0IJ9oiI

Код: https://code.google.com/p/romannurik-code/source/browse/misc/scrolltricks


И, наконец, вот еще одна демонстрация того же эффекта с помощью ListView вместо ScrollView.

https://www.youtube.com/watch?v=rk-tLisxSgM

Код: https://github.com/jatago/list_sticky_scroll_trick

0

Я хотел достичь того же эффекта, как хорошо. Я подошел найти соответствующую библиотеку под названием ObservableScrollView в GitHub и требует больше работы с фоновым контентом с помощью TouchInterceptFramework, но, по крайней мере, он выполнял работу даже для устройств с предварительным лечением. Он также поддерживает не только детские прокрутки и списки, но также и recyclerview. Вот ссылка:

https://github.com/ksoichiro/Android-ObservableScrollView

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

6

Добавить свой пакет поддержки «com.android.support:support-v4:22.1.1» в ваш проект. И попробуйте следующее:

<android.support.v4.widget.NestedScrollView 
     android:id="@+id/nScrollView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fillViewport="true"> 

     <FrameLayout ...> 
      <ListView ... /> 
     </FrameLayout > 
    </android.support.v4.widget.NestedScrollView> 

По умолчанию вложенная прокрутка включена.

+3

Как насчет проблемы, что listview не заполняет ее высоту таким образом? – whizzzkey

+1

@whizzzkey .. Попробуйте добавить android: fillViewport = "true" для вашего ScrollView. –

0

Это классический пример манекенов. Что-то не совсем очевидно при первом взгляде. В основном сценарий - это что-то вроде этого.

Gray Area-> FrameLayout Далее следует список, заполняющий весь кадр, а затем изображение, которое перекрывает верхнюю половину списка. Первый элемент listview - это фиктивный элемент и имеет высоту, идентичную высоте изображения. (Примечание: фактические данные начинаются со второго элемента)

Следующий шаг легко Перевести изображение в соответствии с прокруткой списка.

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

0

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

<ImageView ... /> <!-- must be before ListView --> 

<ListView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="..." <!-- height of imageView --> 
    android:clipToPadding="false" 
    ... 
/> 

Вы не должны управлять любой прокруткой в ​​коде вообще, и он не требует заголовков/фиктивных представлений в вашем адаптере списка.

Смежные вопросы