Как я могу прокрутить список 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;
}
});