2010-08-17 6 views
8

Actualmente tengo la siguiente distribucióncómo puedo listview automáticamente el tamaño por lo que no se desplaza

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentRight="true" 

    android:layout_marginTop="9px" 
    android:layout_below="@+id/desc" 
    android:id="@+id/ll_item" 
    android:orientation="vertical" 
    android:paddingRight="3px" 
    android:paddingLeft="3px" 
    android:paddingBottom="5px" 
    android:paddingTop="5px" 
    android:background="@drawable/rounded_corner_lists" > 
<!-- 
     <ListView android:drawSelectorOnTop="false" android:id="@+id/lv" android:layout_height="fill_parent" android:layout_width="wrap_content" android:divider="#ddd" android:dividerHeight="1px" android:background="@drawable/white" /> 
    --> 
    </LinearLayout> 

la vista de lista que he comentado, he tratado de hacer esto en el xml, con el conjunto de altura a wrap_content, fill_parent, actualmente estoy haciendo esto mediante programación con el siguiente código

LinearLayout ll_item = (LinearLayout) this.findViewById(R.id.ll_item); 
     if(list.length() > 0) 
     { 
      ll_item.setVisibility(View.VISIBLE); 
      LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,calcListHeight(list)); 

      listview = new ListView(this); 
      listview.setBackgroundResource(R.drawable.white); 
      listview.setDivider(new ColorDrawable(this.getResources().getColor(R.drawable.dividercolor))); 
      listview.setDividerHeight(1); 
      listview.setCacheColorHint(0); 

      mAdapter = new JSONAdapter(list, this); 
      listview.setAdapter(mAdapter); 
      mAdapter.notifyDataSetChanged(); 
      ll_item.addView(listview, lp); 
     } 

este es el resultado

alt text

alt text

para que pueda ver en esta imagen, que desde que estoy conteniendo la vista de lista en un LinearLayout para conseguir el aspecto esquina redondeada, no se estira de forma automática simplemente para contener toda la vista de lista, ¿hay alguna La forma de tener los dos elementos simplemente envuelve el contenido verticalmente para que no haya desplazamiento sin que programe la altura automáticamente. ? ?

Creo que una otra cosa que debo mencionar es que tengo todo esto en un diseño ScrollView, porque quiero esta vista de lista para ser una pequeña subsección de todo el trazado, por lo que sería algo así como

-scrollview
-textview
-textview

-linearlayout
-listview

- botón

aquí es un diseño más sencillo de lo que he

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent" 
       android:background="@drawable/bg" xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/titlebar"> 

    <ScrollView android:id="@+id/sv" android:layout_width="fill_parent" android:background="@drawable/bg" 
       android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> 

     <RelativeLayout android:id="@+id/widget28" 
         android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="4dip" 
       > 


      <LinearLayout android:orientation="vertical" style="@style/rounded_corner_full_width_button" 
          android:id="@+id/editfields"> 

       <ListView android:drawSelectorOnTop="false" android:id="@+id/lv" android:layout_height="fill_parent" 
          android:layout_width="wrap_content" android:divider="#ddd" android:dividerHeight="1px" 
          android:background="@drawable/white"/> 

      </LinearLayout> 
     </RelativeLayout> 
    </ScrollView> 
</LinearLayout> 

Respuesta

18

listviews no van en ScrollViews.

ListView es para mostrar una ventana limitada en contenido ilimitado de manera eficiente. Si fuera a "deshabilitar el desplazamiento" en un ListView para ponerlo dentro de un ScrollView, perderá todos los motivos prácticos para usar un ListView en primer lugar.

Si desea utilizar un ListView para mostrar gran cantidad de contenido o contenido ilimitado pero también tiene contenido arriba y abajo que se desplaza con él, agregue vistas de encabezado o pie de página a ListView utilizando addHeaderView o addFooterView. Si el contenido de la lista va a ser una pequeña parte de su diseño general tal como lo describe, probablemente este no sea el mejor enfoque para usted.

Si tiene pequeño, limitado conjunto de contenido para presentar, siga adelante y utilice un ScrollView y genere programáticamente vistas secundarias para sus "elementos de lista" cuando corresponda.

Un patrón común utilizado en el marco para mezclar contenido XML inflado con contenido generado mediante programación es agregar una vista de marcador de posición en el diseño XML, generalmente un LinearLayout o FrameLayout. Use findViewById para localizarlo en tiempo de ejecución y agregarle vistas secundarias generadas.

Incluso se puede seguir utilizando un ListAdapter con este enfoque si tiene uno ya escrito, simplemente llame content.addView(adapter.getView(position, null, content)) en un bucle para todas las posiciones del adaptador (donde content es la vista de marcador de posición se encuentra con findViewById). Tenga en cuenta que esto solo es práctico si sabe que tiene una pequeña cantidad de elementos de lista en el adaptador.

+0

Gracias Adam, yo ya tenía un adaptador que yo era capaz de volver a usar con el LinearLayout la utilización de su pista. –

+0

¡Gracias! Al igual que Artem, pude reutilizar mi adaptador usando una distribución lineal en su lugar. – hyui

+0

Gracias Adam. ¿Su adaptador necesita ser asincrónico? Cuando intento esto, solo agarra mi primer elemento, como que el adaptador no se haya terminado de cargar. – annie

0

añadir un elemento vacío en la lista final

Ejemplo:

ArrayList<String> options = new ArrayList<String>(); 
String lastItem = ""; 
int lastPosition; 

options.add(lastItem); 

public function addItem() { 
    lastPosition = options.size() - 1; 
    lastItem = options.get(lastPosition); 
    options.remove(lastPosition); 

    //add new items dynamically 
    for (int i = 0; i < 5; i++) 
     options.add("new item: "+i); 

    //add empty item 
    options.add(lastItem); 
} 
Cuestiones relacionadas