Android – создайте LinearLayout, который содержит прокручиваемый ListView

Я знаю, что всем рекомендуется, чтобы мы никогда не использовали ListView и ScrollView вместе, и я полностью согласен. Тем не менее, я в настоящее время застрял в очень простой схеме, например странице профиля 8tracks (как показано на рисунке ниже), которые включают область для профиля пользователя и список миксов, которые они сделали. Поэтому в основном желательно, чтобы пользователи могли просто прокручивать эту страницу, что означает, что часть профиля будет отображаться поверх экрана и постепенно выходит из поля зрения, и в то же время прокручивается и следующий список:

Введите описание изображения здесь

Однако на данный момент все, что я могу сделать, это включить ListView в LinearLayout , как и мой эскиз.

Введите описание изображения здесь

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

EDITED : Прошу прощения за вводящий в заблуждение вопрос. Моя проблема еще сложнее, потому что содержимое вкладок не просто ListView – на одной вкладке есть LinearLayout или GridView . Опять же, я хочу, чтобы сделать всю страницу прокручиваемой, но ScrollView не может помочь, потому что если содержимое вкладки представляет собой ListView или GridView , эти представления будут свернуты и, что более важно, – это противоречит правилу проектирования.

Я знаю, что это уже поздно, но я – настоящий разработчик для 8 треков. Приложение (old) 2.x, которое вы указали выше, переписывается, но я могу показать вам, что сделал старый разработчик для страницы профиля.

Прежде чем перейти к этому, я должен сказать, что это не лучший способ сделать это, но приложение 8tracks (2.x) устарело.

Итак, вернемся к коду … ProfileActivity содержит ProfileFragment .

Основной макет, который вы видите с помощью кнопки «Следуй» (и изображения профиля), таков:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <!-- Image, name, location --> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="10dip" > <com.gdub.widget.ImageViewClickable android:id="@+id/dj_avatar" android:layout_width="110dip" android:layout_height="110dip" android:layout_marginRight="10dip" android:background="@drawable/default_avatar_max200" android:scaleType="centerCrop" /> <com.gdub.widget.CollapsingTextView android:id="@+id/dj_location" style="@style/mix.counts" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dip" android:layout_toRightOf="@id/dj_avatar" /> <ViewSwitcher android:id="@+id/profile_action_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/dj_location" android:layout_toRightOf="@id/dj_avatar" > <Button android:id="@+id/follow_btn" style="@style/white_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/follow" /> <Button android:id="@+id/edit_profile_btn" style="@style/white_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/edit_profile" /> </ViewSwitcher> </RelativeLayout> <TextView android:id="@+id/dj_bio" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="-25dip" android:gravity="left|center_vertical" android:lineSpacingExtra="2dip" android:paddingLeft="10dip" android:paddingRight="10dip" android:textColor="@color/default_text" android:textSize="15sp" /> <include android:id="@+id/profile_tabs" layout="@layout/profile_tabs" /> </LinearLayout> 

И profile_tabs …

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" android:orientation="horizontal"> <include android:id="@+id/profile_mixes_button" layout="@layout/profile_tab" /> <include android:id="@+id/profile_followers_button" layout="@layout/profile_tab" /> <include android:id="@+id/profile_following_button" layout="@layout/profile_tab" /> </LinearLayout> 

Таким образом, вы можете видеть, что это обычный макет с тремя кнопками «имитирующие» вкладки.

Содержимое вкладок также продиктовано ViewSwitcher:

 <?xml version="1.0" encoding="utf-8"?> <ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/profile_view_switcher" android:layout_width="match_parent" android:layout_height="match_parent" android:inAnimation="@anim/fade_in_300" android:outAnimation="@anim/fade_out_300" android:background="@color/white"> <include android:id="@+id/profile_loading" layout="@layout/loading_view_full" /> <ListView android:id="@+id/profile_content_list" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="#00000000" android:divider="@null" android:dividerHeight="0dip" android:fadingEdge="none" /> </ViewSwitcher> 

Это показывает загрузочное колесо, а затем переключается на список. Нет другой прокручиваемой группы ViewGroup.

И это в основном это.

Теперь, если вы хотите сделать прокрутку WHOLE, вам нужно использовать пользовательский адаптер и установить вышеуказанный макет в качестве заголовка (или, по крайней мере, использовать getItemType в адаптере умным способом). Таким образом, весь экран является списком (со всеми оптимизациями, которые есть в списке).

Мы (ab) используем это в новом приложении 8tracks под dev. 😉

Попытайтесь использовать следующее в своем списке.

 listview.addHeaderView(v); 

Также помните, вы должны вызвать этот метод перед вызовом setAdapter () в вашем списке.

Включите свой linearlayout, где у вас есть данные пользователя и вкладки, и добавьте его в виде заголовка в список.

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

В соответствии с инструкциями руководства и рекомендациями пользовательского интерфейса рекомендуется не использовать прокручиваемый контент внутри Scrollview, и это предотвращает прокрутку прокручиваемого содержимого.

Когда вы помещаете два scrollview android, просто путайте, что касается вида прокрутки. Поэтому иногда он не может доставить событие касания.

Но если вы хотите достичь прокрутки, вы можете управлять им, используя событие onTouch для определенного вида. И вам нужно соответствующим образом спроектировать ваш макет.

Но даже если это требование заставляет вас делать такие макеты. Попробуй это…

Скажем, это примерно так.

  <ScrollView android:id=”@+id/parent_scroll” android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:layout_weight=”1″ android:background=”@drawable/dotted_bg” android:focusableInTouchMode=”false”> <LinearLayout /> <LinearLayout /> <LinearLayout > <ScrollView android:id=”@+id/child_scroll” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:background=”@drawable/text_box_bg”> <TextView android:id=”@+id/text_description” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:textColor=”@color/gray” android:textSize=”12dip” android:padding=”5dip” android:scrollbars=”vertical”/> <!–ScrollView> </LinearLayout> 

Шаг 1. Предоставьте уникальный идентификатор обоим прокруткам.

Шаг 2: получите ссылку на это два прокрутки в вашей деятельности.

  parentScroll=(ScrollView)findViewById(R.id.parent_scroll); childScroll=(ScrollView)findViewById(R.id.child_scroll); 

Шаг 3: Теперь установите сенсорные слушатели для обоих.

  parentScroll.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { Log.v(TAG,”PARENT TOUCH”); findViewById(R.id.child_scroll).getParent().requestDisallowInterceptTouchEvent(false); return false; } }); childScroll.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { Log.v(TAG,”CHILD TOUCH”); // Disallow the touch request for parent scroll on touch of child view v.getParent().requestDisallowInterceptTouchEvent(true); return false; } }); 

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

Intereting Posts
GetItem против getItemAtPosition Можно ли изменить агент пользователя в Crosswalk Android / Tizen-Apps? Как использовать все ядра / потоки ЦП при запуске сборки студий Android Studio? Прокрутка до / установка позиции настроек пользовательского списка. Понимание того, как использовать класс OverScroller Общие предпочтения – максимальная длина одного значения Возможно ли внедрить глубокие ссылки с веб-сайта на родное приложение? Как публиковать checkin в произвольном месте (например, foursquare) Почему imageView.setLayerType (View.LAYER_TYPE_SOFTWARE, null); И <application android: hardwareAccelerated = "false" имеют другой эффект? Как проверить EditText во Фрагментах и ​​предотвратить изменение фрагмента? Glide не анимирует ImageView, загруженный из кеша Перенести с jack на родную Java 8 Как включить разрешение на чтение и запись контактов при запуске подключенного теста Android? Box2d Check Collision / Overlaping в любой момент Как повесить трубку (отключить, отменить, ..) позвонить?