Добавить вертикальную прокрутку в раздел Android ViewPager
У меня есть viewPager, который я заполняю, используя FragmentStatePagerAdapter. Работает нормально, может пролистывать заполненные страницы по горизонтали.
Однако средний раздел каждой страницы в viewPager состоит из listView. Этот просмотр списка иногда не укладывается в обозначенную область, мне нужно иметь возможность прокручивать вертикально. Но в данный момент я не могу прокручивать вертикально этот раздел viewPager.
Похоже, что viewPager потребляет все события прокрутки (как горизонтальные, так и вертикальные).
Я не хочу вертикальный viewPager; Я видел несколько ответов на это в Stackru.
Я хочу, чтобы только раздел в середине viewPager для прокрутки по вертикали, и этот раздел является listView
Это основной макет для вкладки с viewPager:
<LinearLayout
android:id="@+id/history"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@color/fdi_gray">
<android.support.v4.view.ViewPager
android:id="@+id/historyFragment_container"
android:layout_weight="0.85"
android:layout_width="fill_parent"
android:layout_height="0dip"/>
<include layout="@layout/page_indicator_history"
android:layout_height="0dip"
android:layout_width="fill_parent"
android:layout_weight="0.05"
android:background="@color/darker_gray"
android:layout_marginTop="2dp"/>
</LinearLayout>
А макет, который используется адаптером ViewPager для заполнения над ViewPager, выглядит следующим образом:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/spaceHolderLocations">
<TextView
android:id="@+id/locationName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginTop="10dp"
android:layout_centerHorizontal="true"
android:textStyle="bold"
android:textSize="17sp"/>
<TextView
android:id="@+id/latlon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_below="@+id/locationName"
android:layout_marginTop="2dp"
android:layout_marginBottom="3dp"
android:layout_centerHorizontal="true"/>
<View
android:id="@+id/listViewStart"
android:layout_width="match_parent"
android:layout_height="0.5dip"
android:layout_marginLeft="3dp"
android:layout_marginRight="3dp"
android:layout_below="@+id/latlon"
android:background="@color/white" />
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/fdi_gray"
android:layout_below="@+id/listViewStart"
android:layout_marginLeft="3dp"
android:layout_marginRight="3dp"
android:divider="@color/white"
android:dividerHeight="0.5dip"
android:padding="1dp">
</ListView>
<View
android:id="@+id/listViewEnd"
android:layout_width="match_parent"
android:layout_height="0.5dip"
android:layout_marginLeft="3dp"
android:layout_marginRight="3dp"
android:layout_below="@android:id/list"
android:background="@color/white" />
<TextView
android:id="@+id/curingLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/listViewEnd"
android:gravity="center"
android:text="@string/curingLabel"
android:layout_marginTop="10dp"
android:layout_marginLeft="30dp"
android:textSize="17sp"/>
<TextView
android:id="@+id/curingValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/curingLabel"
android:layout_marginLeft="30dp"
android:layout_alignBottom="@+id/curingLabel"
android:textStyle="bold"
android:textSize="17sp"/>
Пожалуйста, обратите внимание на список в приведенном выше макете.
Это раздел ViewPager, который я хочу прокручивать; но не могу, я могу только прокручивать страницы по горизонтали, а не по вертикали содержимое списка, если оно не соответствует странице.
Этот вопрос подошел близко, но это не то, что я ищу: ссылка
Благодарю.
2 ответа
Реализуйте следующую функциональность. Я надеюсь, что это поможет вам.
mList = (ListView) findViewById(R.id.list);
mList.setOnTouchListener(new View.OnTouchListener () {
@Override
public boolean onTouch(View v, MotionEvent event) {
mList.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
Когда происходит событие касания, родитель всегда перехватывает событие. Здесь родителем является View Pager. Что вы пытаетесь сделать здесь, так это то, что при появлении представления касания в списке попросите родителя не перехватывать событие касания. Таким образом, событие касания будет получено дочерним элементом, который здесь является ListView, и, таким образом, прокручивается соответствующим образом.
По сути, вы не можете установить высоту вашего списка в "обернуть содержимое". задайте фиксированную высоту или выберите другой макет, например, linearlayout, и установите его вес равным 1. если вы установите его для переноса контента, он просто займет все пространство и выйдет за пределы экрана.