2012-08-31 15 views
27

Quiero mostrar una pantalla de perfil para mis usuarios.Deshabilitar el desplazamiento de un ListView contenido dentro de un ScrollView

Se debe tener tres puntos de vista (2 Buttons y una ImageView) y un ListView para mostrar el contenido hecho por ese usuario.

Sin embargo, no quiero que se desplace el ListView. En su lugar, quiero que sea tan grande como sea necesario, y poner todos mis puntos de vista dentro de un ScrollView, por lo que las tres primeras vistas se desplazan con el ListView. Esto, por supuesto, no funciona como se esperaba.

Todos mis tres artículos están dentro de un LinearLayout. Pensé en convertirlos en el primer artículo en el ListView, pero esto hace que se puedan seleccionar como el primer elemento y tener que hacer una codificación innecesaria.

¿Hay alguna manera de hacer esto de la manera más fácil o tendré que conformarme con hacer que el diseño sea el primer elemento en mi ListView?

+0

cheque esto: http://stackoverflow.com/questions/4338185/how-to- get-a-non-scrollable-listview –

+0

Sí, pero si uso LinearLayout en lugar de ListView, no obtengo un evento OnItemSelected, lo que conduce a una codificación más innecesaria. – razielsarafan

+0

hojee el enlace y léalo cuidadosamente. use listview en LinearLayout. establezca ScrollContainer en falso y puede vincular un OnClickListener o OnTouchListener a una vista que se activará cuando se haga clic o toque –

Respuesta

6

de agregarlos a la ListView como el primer artículo parece una solución bastante buena.

Para hacer que la Vista no se pueda seleccionar simplemente obtenga la vista y .setClickable(false).

11

Usted puede hacer esto mediante la

listView.setScrollContainer(false); 

para más compruebe

How to get a non scrollable ListView?

+6

Esto no funciona y el enlace que proporcionó contradice su respuesta. –

+1

@MattW Dije esta causa de referencia de esta respuesta "No coloque una vista de lista en una vista de desplazamiento, no funciona. Si desea una lista de elementos que no se desplazan, se denomina distribución lineal". el código anterior no funcionará en realidad la vista de lista tiene un problema con el diseño de la vista de desplazamiento. –

+0

@SaifuddinSarker, pero ¿qué ocurre si tengo una cantidad dinámica de elementos que deseo mostrar en la lista que no se puede desplazar? – Micer

5

Agregaría un View con fondo invisible en la parte superior de ListView. Establezca un View.OnTouchListener() a él. Y consuma el evento devolviendo true en el método onTouch() de View.OnTouchListener().

Cuando se desea que la lista se desplaza de nuevo, retire el oyente táctil situado en la transparencia View

2

si tiene que mostrar número limitado de elementos en la vista de lista y desea dejar de vista de la lista de desplazamiento, entonces debe mantener la altura de la vista de lista mayor que la altura total de los elementos.

por ejemplo, quiere mostrar 3 elementos. (altura de la fila es 30). a continuación, la altura total de los artículos se convierte en 3 x 30dp = 90dp,

por lo que ahora tiene que establecer listview altura mayor que 90. e.g .: 100dp. así que ahora su vista de lista no se desplazará en ningún caso.

39

Encontré una solución muy simple para esto. Simplemente obtenga el adaptador de la vista de lista y calcule su tamaño cuando se muestren todos los elementos. La ventaja es que esta solución también funciona dentro de ScrollView.

Ejemplo:

public static void justifyListViewHeightBasedOnChildren (ListView listView) { 

    ListAdapter adapter = listView.getAdapter(); 

    if (adapter == null) { 
     return; 
    } 
    ViewGroup vg = listView; 
    int totalHeight = 0; 
    for (int i = 0; i < adapter.getCount(); i++) { 
     View listItem = adapter.getView(i, null, vg); 
     listItem.measure(0, 0); 
     totalHeight += listItem.getMeasuredHeight(); 
    } 

    ViewGroup.LayoutParams par = listView.getLayoutParams(); 
    par.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1)); 
    listView.setLayoutParams(par); 
    listView.requestLayout(); 
} 

llamar a esta función que pasa sobre el objeto ListView:

justifyListViewHeightBasedOnChildren(myListview); 

La función anterior es un modidication de un puesto de: Disable scrolling in listview

Tenga en cuenta que llame a esta función después de haber configurado el adaptador en la vista de lista. Si el tamaño de las entradas en el adaptador ha cambiado, debe llamar a esta función también.

+1

El método dado funciona, pero después de hacerlo, mi desplazamiento es el que más baja. Toda la página se desplaza hacia abajo. Alguna solución ? –

+0

Gracias por la excelente respuesta.Resolvió mi problema –

-1

en el archivo XML sólo hay que poner

<listview android:nestedScrolling="false"/> 

Funciona para mí ...

+0

Encontré 'android: nestedScrollingEnabled =" false "', pero el problema en mi caso es "Attribute nestedScrollingEnabled solo se usa en API nivel 21 y superior". – Micer

Cuestiones relacionadas