Как я могу сделать элементы с горизонтальной прокруткой в ​​вертикальном списке?

Я хотел бы использовать элементы с горизонтальной прокруткой в ​​списке с вертикальной прокруткой.

Мое наивное решение заключалось в том, чтобы поместить содержимое элементов списка в scrollView. Элементы шире по горизонтали, чем вид прокрутки, но не выше прокрутки. Поскольку listview является обычным списком с вертикальной прокруткой, я решил, что вертикальное перетаскивание будет прокручивать список, а горизонтальное - прокрутить элементы.

Однако это не сработало. Список хорошо прокручивается по вертикали и правильно отображает элементы, но горизонтальная прокрутка не работает (ничего не происходит). К сожалению, я действительно не знаю, что делать дальше.

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

В качестве справки я хотел бы, чтобы список вел себя аналогично тому, что он делает в приложении «Pulse», если вы его видели.


person Mikael_S    schedule 31.01.2011    source источник


Ответы (4)


Сделайте обычный ListView любым adapter, который вам нравится, но создайте макет элемента примерно так:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <HorizontalScrollView
        android:id="@+id/hor_scroll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <LinearLayout
            android:id="@+id/lin"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/icon"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_marginRight="6.0dip"
                android:layout_alignParentTop="true"
                android:layout_alignParentBottom="true"
                android:focusable="false" />

            <TextView
                android:textAppearance="?android:textAppearanceMedium"
                android:gravity="center_vertical"
                android:id="@+id/text"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:singleLine="true"
                android:layout_toRightOf="@id/icon"
                android:layout_alignParentTop="true"
                android:layout_alignParentBottom="true" />

        </LinearLayout>

    </HorizontalScrollView>


</RelativeLayout>

У вас будет Scrollable ListView по вертикали с Scrollable по горизонтали. И элементы прокручиваются независимо от других элементов.

person Jilberta    schedule 13.09.2013

Вам необходимо использовать HorizontalScrollView. Droidstack - это приложение с открытым исходным кодом (я написал), которое делает именно это (в списках вопросов вы можете прокрутите теги по каждому вопросу), если вам нужен конкретный пример.

person Felix    schedule 31.01.2011
comment
При этом вы теряете возможность щелчка по элементу ListView. Другими словами, нажатие на прокручиваемое содержимое не переадресовывается в Listview. - person ol_v_er; 09.02.2012

Если вы следуете передовой практике разработки Android, вам никогда не следует помещать ScrollView в ListView, это не рекомендуется, но Ромен Гай и другие люди, занимающиеся разработкой Android, прочтите аргументы, прочитанные здесь: Проблема с макетом Android ScrollView

из документов Android:

"Вы никогда не должны использовать HorizontalScrollView с ListView, поскольку ListView заботится о своей собственной прокрутке. Что наиболее важно, это сводит на нет все важные оптимизации в ListView для работы с большими списками, поскольку это фактически заставляет ListView отображать весь свой список элементов, чтобы заполнить бесконечный контейнер, предоставляемый HorizontalScrollView. "

РЕДАКТИРОВАТЬ: похоже, что опубликованное выше предупреждение является ошибкой из документации Android, разговаривая с некоторыми коллегами, они сказали мне, что это возможно. Проблема в документации здесь, http://code.google.com/p/android/issues/detail?id=2781.

мои извинения

person Franco    schedule 31.01.2011
comment
Хорошо, но какая тогда альтернатива? - person Mikael_S; 31.01.2011
comment
я разговаривал с некоторыми коллегами и рассказал мне о проблеме в документации по Android, я отредактировал свой пост, извинения - person Franco; 31.01.2011
comment
Я думаю, что эта цитата пытается сказать, что вы не должны помещать ListView внутри ScrollView, а не наоборот, что должно быть нормально. - person Felix; 31.01.2011

Вы можете использовать ViewPager. Каждый элемент в списке может быть ViewPager.

person Chris Sim    schedule 28.05.2013