2011-03-24 17 views
10

Duplicar posible:
Listview inside ScrollView is not scrolling on AndroidListView dentro de un ScrollView

Tengo una ListView dentro de un ScrollView y el problema es que el ScrollView se desplaza pero ListView no se desplaza. Creo que esto está sucediendo por eso ScrollView. ¿Alguien tiene una solución para este problema?

+0

dejar de discutir sobre ello, no lo puedo resolver la cuestión, alguien ya encontrar la solución, esta es la respuesta de Moisés Olmedo: http://stackoverflow.com/questions/6210895/listview-inside-scrollview-is -no-scrolling-on-android? rq = 1 – Bhimbim

Respuesta

6

ListView s tienen funciones de desplazamiento incorporadas. Encapsularlo en cualquier otro diseño como LinearLayout o RelativeLayout.

1

No debe anidar un ListView dentro de un ScrollView.

Si está intentando desplazarse por algunas otras vistas junto con ListView, puede consultar this answer.

3

¡Utilice el siguiente método y diviértase!

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); 
      } 
     } 
    }); 
} 

listaViewTouchAction es un valor entero global. Si puede reemplazar la línea

list.scrollBy(0, 1); 

con otra cosa por favor, comparta con nosotros.

5

Necesité tener una vista de lista dentro de una vista de desplazamiento para evitar que toda la pantalla sea extremadamente larga. Esto le permite establecer el número de elementos que se muestran en la lista, mientras que el resto se desplazará.

Utilizo 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; 
    } 
} 
+0

El problema que tengo con esta solución es que cuesta una gran cantidad de energía de la CPU. En el método onMeasure, le pides al listadapter que vuelva a crear cada vista que solicites, esto hará que toda la aplicación sea muy lenta. Creo que debes guardar en caché las vistas que pides y solo recrearlas cuando no sean válidas. –

+0

Si bien no he notado ningún problema con esta solución en mi Atrix, estoy seguro de que podría ser un problema en dispositivos más antiguos. – Jeff

Cuestiones relacionadas