Как я могу прокрутить список ListView?

У меня довольно сложная компоновка View, и, как часть этого, у меня есть ListView внутри LinearLayout в ScrollView (и довольно много компонентов, но они не имеют значения в этой проблеме).

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

Мой вопрос может звучать легко, но я не смог это исправить... Возможно ли прокручивать ListView?

Соответствующий XML:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

    <LinearLayout android:id="@+id/GlobalLayout" 
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:orientation="vertical" >

        <ListView android:id="@+id/EndpointList"
                  android:choiceMode="multipleChoice"
                  android:layout_height="175dip"
                  android:layout_width="fill_parent" />

    </LinearLayout>

</ScrollView>

Ответ 1

Собственно, способ, которым я его настроил, действительно работает... Размещение ListView в LinearLayout в ScrollView. Просто избегайте того, чтобы ListView был прямым дочерним элементом ScrollView, и он будет работать нормально...

Просто имейте в виду, что если в ListView недостаточно элементов, чтобы заполнить его, значит, он выходит за пределы экрана, что он не будет прокручиваться (например, логически). Также обратите внимание, что, когда у вас достаточно элементов для прокрутки, вам нужно продолжать нажимать на элемент в ListView, чтобы он прокручивался, а половина времени фокусируется на глобальном scrollview вместо ListView... To избегайте этого (большую часть времени), продолжайте нажимать на самый верхний или самый нижний элемент, в зависимости от того, какой путь вы хотите прокрутить. Это оптимизирует ваш шанс сосредоточиться на вашем ListView.

Я сделал видео, которое возможно, я загружаю его сейчас на YouTube...

Видео http://www.youtube.com/watch?v=c53oIg_3lKY. Качество плохое, но это доказывает мою мысль.

Просто для глобального обзора я использовал ScrollView, чтобы иметь возможность прокручивать всю свою активность, LinearLayout для макета Activity и ListView, чтобы сделать список...

Ответ 2

Вместо ListView с другими макетами внутри ScrollView создайте один ListView с верхним и нижним колонтитулом.

Добавить представления, которые должны быть выше ListView в виде заголовка:

addHeaderView(View v)

а ниже - нижний колонтитул:

addFooterView(View v)

Поместите все, что должно быть выше ListView в заголовок ListView, и то же самое с нижним колонтитулом.

    LayoutInflater inflater = LayoutInflater.from(this);
    mTop    = inflater.inflate(R.layout.view_top, null);
    mBottom = inflater.inflate(R.layout.view_bottom, null);

    list.addHeaderView(mTop);
    list.addFooterView(mBottom);
    // add header and footer before setting adapter
    list.setAdapter(mAdapter);

В результате вы получите одно прокручиваемое представление.

Ответ 3

Я хотел бы просто отметить что-то для видео

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

scrollview затем рассмотрит, что место, к которому вы коснулись, не имеет детей, чтобы отправить motionevent в... так что он вызывает super.dispatchTouchEvent, который в этом случае является View.dispatchTouchView, следовательно, listview.onTouchEvent.

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

Надеюсь, что мое объяснение было достаточно ясным, чтобы указать, почему он не работает.

Ответ 4

Попробуйте использовать этот код

        ListView listView = ( ListView ) findViewById(R.id.lsvButton3);
        listView.setOnTouchListener(new ListView.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                switch (action) {
                    case MotionEvent.ACTION_DOWN:
                        // Disallow ScrollView to intercept touch events.
                        v.getParent().requestDisallowInterceptTouchEvent(true);
                        break;

                    case MotionEvent.ACTION_UP:
                        // Allow ScrollView to intercept touch events.
                        v.getParent().requestDisallowInterceptTouchEvent(false);
                        break;
                }

                // Handle ListView touch events.
                v.onTouchEvent(event);
                return true;
            }
        });