Непрокручиваемый ListView внутри ScrollView

Я пытаюсь сделать макет следующим образом:

расположение

Проблема в том, что я не хочу, чтобы ListViews был прокручиваемым. Я хочу, чтобы они были настолько высокими, насколько это необходимо, и сделать весь экран прокручиваемым. Если я установил высоту ListView в wrap_content , это не сработает. Единственный способ заставить его работать – установить определенную высоту, но я не знаю, сколько элементов будет в ListView.

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

Может быть, есть лучший способ заставить его работать?

Вы создаете пользовательский ListView, который не прокручивается

 public class NonScrollListView extends ListView { public NonScrollListView(Context context) { super(context); } public NonScrollListView(Context context, AttributeSet attrs) { super(context, attrs); } public NonScrollListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom); ViewGroup.LayoutParams params = getLayoutParams(); params.height = getMeasuredHeight(); } } 

В файле ресурсов макета

            

В файле Java

Создайте объект customListview вместо ListView, например:
NonScrollListView non_scroll_list = (NonScrollListView) findViewById (R.id.lv_nonscroll_list);

Нет необходимости использовать список.

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

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

Лучший способ сделать это (в 2017 году) – использовать RecyclerView с NestedScrollView. Никаких хаков не требуется, и он работает из коробки, как вы этого хотите.

Ну, есть classный парень Android по имени Марк Мерфи, известный как CommonsWare, и он создал очень полезный компонент под названием CWAC Merge Adapter, который позволяет вам делать то, что вам нужно. Вам нужно будет добавлять представления динамически, а не из XML; но, учитывая ваш простой пользовательский интерфейс, это не должно быть проблемой. Я использую его для таких случаев, когда я понятия не имею, какие данные я должен прокручивать.

Если вы не хотите использовать его (возможно, по причинам, связанным с лицензированием), вы можете иметь один список (вместо двух последовательных списков) и переопределять getItemViewsCount , getItemViewType и getView для того, чтобы дать выше макет. Если вы найдете в android listview different rows поисковых android listview different rows в Google, вы найдете полезную информацию. Например, эта ссылка , или эта .

Однако я бы пошел на слияние-адаптер.

У меня есть простое решение, если можно рассчитать высоту вашего объекта / ширину … Вам просто нужно создать родительский Linringayout из ListView, а затем зафиксировать родительскую высоту из Java.

введите описание изображения здесь

Предположим, вам нужно создать это представление … Теперь размер макета родителя определяется из java …

 final LinearLayout parent=(LinearLayout)findViewById(R.id.parent); final ListView listview=(ListView)findViewById(R.id.listview); parent.setLayoutParams(new LinearLayout.LayoutParams(parent.getLayoutParams().width, dpToPx( number_of_item_in_list * per_item_size_in_dp ))); //number_of_item_in_list is list side ~ listArray.size(); //per_item_size_in_dp = calculate item size in dp. Ex: 80dp public static int dpToPx(int dp) { return (int) (dp * Resources.getSystem().getDisplayMetrics().density); } 

это все 🙂

Выберите ListView, который вы хотите прокручивать, и после этого добавьте метод setOnTouchListener для автоматической установки прокрутки внутри ListView

 final ListView listview = (ListView) findViewById(R.id.list); 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; } }); listview.setClickable(true); 

Я надеюсь, что это сработает для вас

  • Программно перейдите к определенной позиции в Android ListView
  • Пользовательский getFilter в пользовательском ArrayAdapter в android
  • Удалить элементы ListView на Android
  • как установить режим выбора для списка с изображениями
  • Скрытие ActionBar в RecyclerView / ListView onScroll
  • Цвет монитора ListView для Android
  • Android: доступ к дочерним представлениям из списка ListView
  • Ошибка Listview: «В вашем контенте должен быть ListView с атрибутом id« android.R.id.list »
  • Множественный выбор в пользовательском ListView с CAB
  • ListFragment не принимает мой макет
  • Как я могу обновить одну строку в ListView?
  • Давайте будем гением компьютера.