Intereting Posts
Android: управление мягкой клавиатурой по желанию HTC Как добавить кнопку на экран предпочтения? Eclipse ADT – это не Samsung s3 как устройство Android? Зажигание Kindle Fire и повреждение текстуры со скоростью 60 кадров в секунду Android как вращать холст rect Как изменить шрифт / цвет / размер в Xamarin C # Я отслеживаю приложение для Android в Google Analytics. Почему у меня есть пользователи Macintosh? Преобразование неизменяемого файла растрового изображения в изменчивое растровое изображение Android прокрутка фона растровых плит Программно изменить RelativeLayout toRightOf на toLeftOf Android: Хорошо ли хранить токен аутентификации в общих предпочтениях? Запустить приложение / намерение Android из тега NFC? Поддержка уровня базовой поддержки Android H.264 Как использовать один источник библиотеки для нескольких проектов Как использовать различную активность запуска в аромате продукта?

Как получить прокручиваемый ListView?

Мне нужно прокрутить список ListView и показать весь ListView. Это потому, что весь мой экран – ScrollView, и я отправляю виджеты с RelativeLayout, поэтому мне не нужен прокрутка ListView.

Я установил ui с кодом, а не с xml.

Я использовал listView.setScrollContainer(false) , но это не работает, я не понимаю, почему.

Благодарю.

Solutions Collecting From Web of "Как получить прокручиваемый ListView?"

Не помещайте listview в scrollview, это не работает. Если вам нужен список элементов, который не прокручивается, он называется linearlayout.

Правильный ответ здесь.

Просто назначьте этот прослушиватель в ListView :

  listView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_MOVE) { return true; // Indicates that this has been handled by you and will not be forwarded further. } return false; } }); 

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

Пример:

 public void justifyListViewHeightBasedOnChildren (ListView listView) { ListAdapter adapter = listView.getAdapter(); if (adapter == null) { return; } ViewGroup vg = listView; int totalHeight = 0; for (int i = 0; i < adapter.getCount(); i++) { View listItem = adapter.getView(i, null, vg); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams par = listView.getLayoutParams(); par.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1)); listView.setLayoutParams(par); listView.requestLayout(); } 

Вызовите эту функцию, проходящую через объект ListView:

 justifyListViewHeightBasedOnChildren(myListview); 

Функция, показанная выше, является модификацией сообщения в: Отключить прокрутку в списке

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

В зависимости от того, что именно вы пытаетесь сделать, вы можете решить свою проблему, отбросив ScrollView и вместо этого используя ListView addHeaderView(View) и addFooterView(View) .

Я придумал BaseAdapterUnscrollable. В основном это просто добавляет представления в контейнер ViewGroup. Реализация немного напоминает BaseAdapter. Это довольно удобно, если вы используете несколько прокручиваемых списков, подобных этому в проекте.

В onCreate:

  PeopleAdapter peopleAdapter = new PeopleAdapter(this, personList, containerPeopleLinearLayout); peopleAdapter.setOnItemClickListener(this); peopleAdapter.drawItems(); 

Ваш конкретный адаптер:

 public class PeopleAdapter extends BaseAdapterNonScrollable<Person> { public PeopleAdapter(Context context, List<Person> items, LinearLayout container) { super(context, items, container); } @Override public View getView(View container, Person person) { TextView textView = (TextView) LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1, null); textView.setText(person.getName()); return textView; } 

}

BaseAdapterNonScrollable (просто копировать):

 public abstract class BaseAdapterNonScrollable<T> implements NonScrollable, OnItemClick { public Context context; private ViewGroup containerViewGroup; private List<T> itemObjectList; private OnItemClick itemClickListener; public BaseAdapterNonScrollable(Context context, List<T> items, ViewGroup containerViewGroup) { this.context = context; this.itemObjectList = items; this.containerViewGroup = containerViewGroup; } @Override public void drawItems() { if (containerViewGroup == null || itemObjectList.size() == 0) { return; } if (containerViewGroup.getChildCount() > 0) { containerViewGroup.removeAllViews(); } //draw all items for (int i = 0; i < itemObjectList.size(); i++) { final int position = i; final View itemView = getView(containerViewGroup, itemObjectList.get(i)); if (itemView != null) { containerViewGroup.addView(itemView); //handle item click event itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (itemClickListener != null) { itemClickListener.onItemClick(itemObjectList, position); } } }); } } } public void setOnItemClickListener(OnItemClick onItemClick) { this.itemClickListener = onItemClick; } public abstract View getView(View container, T itemObject); @Override public void onItemClick(List<?> itemList, int position) { } 

}

Интерфейсы

 public interface NonScrollable { void drawItems(); } public interface OnItemClick { void onItemClick(List<?> itemList, int position); } 

Для отключения прокрутки вы можете использовать listview.setEnabled(false)

Это также отключает выбор строк.