ListView dentro de un ScrollView
Posible duplicado:
Listview dentro de ScrollView no se desplaza en Android
Tengo un ListView
dentro de ScrollView
y el problema es que el ScrollView
está moviendo pero ListView
no se desplaza. Creo que esto está sucediendo debido a que ScrollView
. ¿Alguien tiene una solución para este problema?
- Llame a removeView () en el padre del niño primero
- Eliminar la pista de la barra de desplazamiento de ScrollView en Android
- Barra de desplazamiento en android
- Android ScrollView puede alojar sólo un hijo directo
- Habilitar desplazamiento dentro de EditText que está en ScrollView
- Problema con webview y scrollview
- ScrollView corta la parte superior y deja espacio en la parte inferior
- Scrolling jerky antes de frenar cuando edittext solo dentro de scrollview
- Cómo mostrar siempre la barra de desplazamiento
- Android: ¿Cómo puedo hacer elementos desplazables horizontalmente en una lista vertical?
- Android ScrollView (desplazable en Horizontal y Vertical suavemente) en el que el contenido se puede agregar programable y zoomable en pinch
- Los botones dentro de ScrollView dentro de Galería no responden al clic
- ScrollView - ¿Cómo desplazarse hacia abajo mientras se diseña el diseño en Eclipse?
ListView
tiene capacidades de desplazamiento integradas. Encapsularlo en cualquier otro diseño como un LinearLayout
o RelativeLayout
.
Necesito tener un listview dentro de una vista de desplazamiento para evitar que la pantalla entera sea extremadamente larga. Esto permite que usted tenga que fijar el número de artículos exhibidos en la lista, mientras que el resto será desplazado.
Yo uso la siguiente clase en mi aplicación y hasta ahora parece funcionar fenomenal.
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; } }
¡Usa el siguiente método y disfruta!
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 es un valor entero global. Si puede reemplazar la línea
list.scrollBy(0, 1);
Con otra cosa por favor comparta con nosotros.
No debe anidar un ListView dentro de ScrollView.
Si está intentando desplazar algunas otras vistas junto con ListView, puede consultar esta respuesta .
- Android NDK UnsatisfiedLinkError – una razón sorprendente
- Anula la versión de Java cuando construye un proyecto Cordova con gradle