ListView внутри ScrollView

Возможный дубликат:
Listview внутри ScrollView не прокручивается на Android

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

ListView есть встроенные возможности прокрутки. Инкапсулируйте его в любом другом макете, таком как LinearLayout или RelativeLayout .

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

Я использую следующий класс в своем приложении, и пока это кажется потрясающим.

  public class NestedListView extends ListView implements OnScrollListener, OnTouchListener { private int listViewTouchAction; private static final int MAXIMUM_LIST_ITEMS_VIEWABLE = 4; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) { if (listViewTouchAction == MotionEvent.ACTION_MOVE) { scrollBy(0, -1); } } } public NestedListView(Context context, AttributeSet attrs) { super(context, attrs); listViewTouchAction = -1; setOnScrollListener(this); setOnTouchListener(this); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int newHeight = 0; final int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); if (heightMode != MeasureSpec.EXACTLY) { ListAdapter listAdapter = getAdapter(); if (listAdapter != null && !listAdapter.isEmpty()) { int listPosition = 0; for (listPosition = 0; listPosition < listAdapter.getCount() && listPosition < MAXIMUM_LIST_ITEMS_VIEWABLE; listPosition++) { View listItem = listAdapter.getView(listPosition, null, this); listItem.measure(widthMeasureSpec, heightMeasureSpec); newHeight += listItem.getMeasuredHeight(); } newHeight += getDividerHeight() * listPosition; } if ((heightMode == MeasureSpec.AT_MOST) && (newHeight > heightSize)) { if (newHeight > heightSize) { newHeight = heightSize; } } } else { newHeight = getMeasuredHeight(); } setMeasuredDimension(getMeasuredWidth(), newHeight); } @Override public boolean onTouch(View v, MotionEvent event) { listViewTouchAction = event.getAction(); if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) { if (listViewTouchAction == MotionEvent.ACTION_MOVE) { scrollBy(0, 1); } } return false; } } 

Используйте следующий метод и наслаждайтесь!

  private void setListViewScrollable(final ListView list) { list.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { listViewTouchAction = event.getAction(); if (listViewTouchAction == MotionEvent.ACTION_MOVE) { list.scrollBy(0, 1); } return false; } }); list.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (listViewTouchAction == MotionEvent.ACTION_MOVE) { list.scrollBy(0, -1); } } }); } 

ListViewTouchAction – глобальное целочисленное значение. Если вы можете заменить линию

 list.scrollBy(0, 1); 

С чем-то другим, пожалуйста, поделитесь им с нами.

Вы не должны вставлять ListView внутри ScrollView.

Если вы пытаетесь прокрутить некоторые другие представления вместе с ListView, вы можете проверить этот ответ .