2010-10-24 22 views
6

Este es el escenario conceptual (excluyendo linearlayouts)problemas de desplazamiento con un ListView dentro de un ScrollView

ScrollView 
    Button 
    Checkboxes 
    Spinner 
    ListView (full-size, non-scrolling) 
AdMob advert 

es decir, un panel de desplazamiento, que tiene una interfaz de usuario de filtrado en la parte superior, seguido por los resultados, pero el anuncio debe permanecer siempre visible, y cuando se desplaza hacia abajo, la IU del filtro debe desplazarse, dejando un espacio máximo para los resultados.

Soy consciente de que hay problemas con un ListView dentro de un ScrollView, aunque para mí funciona bien de muchas maneras (estoy arreglando la longitud del ListView para detener el colapso). Así que la pantalla se desplaza muy bien, el anuncio permanece en la parte inferior, y se ve bien.

Pero el problema que estoy viendo es, inexplicablemente, cuando se abre la actividad, ScrollView se desplaza un poco hacia abajo, por lo que ListView se encuentra en la parte superior de la pantalla. Asumo que esto es un comportamiento por defecto, por lo que se dedicó a tratar de forzar la posición de desplazamiento de la ScrollView a la parte superior, pero he intentado varios métodos, y veo ningún efecto:

scrollview.scrollTo(0, 1000/-1000); 
scrollview.smoothScrollBy(0, 1000/-1000); 
scrollview.fullScroll(View.FOCUS_UP); 

¿Hay alguna manera de forzar el ScrollView para comenzar con la posición de desplazamiento en la parte superior?

Si no es así, ¿cómo puedo tener un anuncio que no se desplace desde la parte inferior, sino una interfaz de usuario de filtro que siempre se desplaza por la parte superior? Usar ListView parece excesivo ya que no necesito desplazarme, pero proporciona muchos beneficios, por lo que sería bueno evitar comenzar desde cero y renderizar todo yo mismo.

+0

¿Alguna solución real para este problema? – Tony

+0

Esta no es una buena práctica, pero si intentas dar una altura a la vista de lista en tiempo de ejecución de lo que es posible. Vea el enlace a continuación: - http://stackoverflow.com/questions/3495890/how-can-i-put-a-listview-into-a-scrollview-without-it-collapsing/3495908#3495908 – duggu

Respuesta

0

¿Por qué usa una vista de lista si no está desplazándose? ¿Por qué no puedes simplemente usar un diseño lineal o algo más adecuado para esta situación? Mencionas un filtro, podrías enrollar fácilmente tu propio filtro especialmente porque aparentemente solo tienes algunos elementos en tu lista.

+0

Lleno el ListView desde un adaptador, y no puedo hacer eso con LinearLayout. Los elementos en ListView son dinámicos, y ciertamente estaría muy interesado en saber qué funcionaría mejor como reemplazo de ListView, así que resuelvo el problema del desplazamiento, pero conservo los beneficios de ListView, como el enlace de datos y la reutilización de elementos. ¿Tendría sentido reemplazar el ListView con un AdapterView? –

+0

Puede crear un adaptador y simplemente no vincularlo a una vista de lista – Falmarri

+0

¿A qué lo vincularía? –

0

Use algo más que un ListView, puede generar dinámicamente linearLayouts para mostrar los datos que desea. Nunca debe usar una vista de lista dentro de una vista de desplazamiento, no funciona por una razón simple, cuando se desplaza, lo que debería desplazarse, la vista de lista o la vista de desplazamiento. Un par de personas de Google han declarado que no deben hacer esto.

+0

Claro, entiendo que usar un control de desplazamiento dentro de un control de desplazamiento es una mala noticia (desde la perspectiva de la interfaz de usuario, y mucho menos la implementación) pero en un escenario donde ListView no tiene barras de desplazamiento, esta limitación tiene menos sentido. –

+0

¿Cómo se garantiza que la vista de lista no se desplace? – Falmarri

+0

El hecho de que doesnt scroll indica que no hay mucha información para mostrar, ese fue mi principal razonamiento para pensar que debería necesitar una vista de lista. – blindstuff

0

Experimenté el problema de que ScrollView comenzando se desplazó ligeramente hacia abajo, la solución fue publicar un ejecutable que llamaba al método animarTo (0,0) para obtener la lista para desplazarse a la parte superior. Encontré que esto solo funcionaba usando anitmatTo (0,0) scrollTo (0,0) no parecía funcionar.

Algo a lo largo de las líneas de:

mListView.post(new Runnable(){ public void run() { mListView.animateScrollTo(0,0) }); 

Ahora bien, como todo el mundo ya ha declarado que no debe hacer todo el ListView dentro de un ScrollView, pero esto puede ser una solución para el problema que tenías.

+0

Mirando hacia atrás en esto después de unos meses, la respuesta a lo que estaba tratando de hacer parece bastante obvia: el encabezado de ListView. Nunca me hubiera desplazado dentro del desplazamiento, pero sí necesité un ListView y otras cosas para desplazarme como un bulto, y el ListView ya tiene todo eso en él. Es fácil pasar por alto estas cosas cuando las interfaces públicas son tan grandes en algunas clases de Android. –

1

¡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.

0

que tengo:

ScrollView 
TextView 
Button 
TextView 
ListView 

y este trabajo bueno para mí:

scrollView.smoothScrollBy(0, 0);   

sin este punto de vista inicio de la posición de la vista de lista, después de que se inicia desde la parte superior

-1

La solución para este problema es hacer que una solicitud se enfoque en un objeto en la parte superior de ScrollView. Por ejemplo, puede usar un diseño de tabla que envuelva el botón y solicite enfoque al diseño de la tabla (si enfoca el botón, cambiará su color).

// onCreate method 
TableLayout tablelayout = (TableLayout) findViewById(R.id.tablelayout); 
tablelayout.setFocusableInTouchMode(true); 
tablelayout.requestFocus(); 
Cuestiones relacionadas