2012-06-05 18 views
8

Agregué dinámicamente elementos a un ListView y quiero que todos los elementos estén siempre visibles, sin desplazarse.¿Es posible deshabilitar el desplazamiento en una lista Vista?

Código

Diseño:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/recipe_inside" 
android:orientation="vertical" > 

<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 

     <ImageView 
      android:id="@+id/imageView1" 
      android:layout_width="match_parent" 
      android:layout_height="16dp" 
      android:src="@drawable/head_cella" /> 

     <TextView 
      android:id="@+id/textView1" 
      android:layout_width="wrap_content" 
      android:layout_height="41dp" 
      android:background="@drawable/body_cella" 
      android:gravity="center_horizontal" 
      android:paddingTop="5dp" 
      android:text="Remember to save before leaving this page or inserted/modified data will be lost." 
      android:textColor="#000000" 
      android:textSize="13dp" /> 

     <ImageView 
      android:id="@+id/ImageView01" 
      android:layout_width="match_parent" 
      android:layout_height="16dp" 
      android:layout_marginTop="30dp" 
      android:src="@drawable/head_cella" /> 

     <TextView 
      android:id="@+id/TextView01" 
      android:layout_width="wrap_content" 
      android:layout_height="35dp" 
      android:background="@drawable/body_cella" 
      android:gravity="center_horizontal" 
      android:paddingTop="10dp" 
      android:text="Category" 
      android:textColor="#000000" 
      android:textSize="15dp" /> 

     <Spinner 
      android:id="@+id/category_spinner" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

     <ImageView 
      android:id="@+id/ImageView02" 
      android:layout_width="match_parent" 
      android:layout_height="16dp" 
      android:layout_marginTop="30dp" 
      android:src="@drawable/head_cella" /> 

     <TextView 
      android:id="@+id/TextView02" 
      android:layout_width="wrap_content" 
      android:layout_height="35dp" 
      android:background="@drawable/body_cella" 
      android:gravity="center_horizontal" 
      android:paddingTop="10dp" 
      android:text="Name" 
      android:textColor="#000000" 
      android:textSize="15dp" /> 

     <EditText 
      android:id="@+id/recipe_title" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:ems="10" 
      android:hint="Recipe title" android:lines="1"/> 

     <ImageView 
      android:id="@+id/ImageView03" 
      android:layout_width="match_parent" 
      android:layout_height="16dp" 
      android:layout_marginTop="30dp" 
      android:src="@drawable/head_cella" /> 

     <TextView 
      android:id="@+id/TextView03" 
      android:layout_width="wrap_content" 
      android:layout_height="35dp" 
      android:background="@drawable/body_cella" 
      android:gravity="center_horizontal" 
      android:paddingTop="10dp" 
      android:text="Ingredients" 
      android:textColor="#000000" 
      android:textSize="15dp" /> 
     <ListView 
      android:id="@android:id/list" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" android:cacheColorHint="#00000000" android:divider="#00000000" 
      android:isScrollContainer="false" 
      > 
     </ListView> 

     <Button 
      android:id="@+id/button_ing" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="" android:background="@drawable/add_recipe_button" android:onClick="addItems"/> 

    </LinearLayout> 

</ScrollView></LinearLayout> 

edad OnCreate() código de función:

protected void onCreate(Bundle savedInstanceState) 
{ 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.add_recipe_form); 

    spinner = (Spinner)myhead.findViewById(R.id.category_spinner); 

    Cursor cursor = mydb.getCategoriesList(); 
    ArrayList<Category> list = new ArrayList<Category>(); 
    list.add(new Category(0,"Choose a category")); 

    while (cursor.moveToNext()) { 
     list.add(new Category(cursor.getInt(0),cursor.getString(1))); 
    } 
    // Step 2: Create and fill an ArrayAdapter with a bunch of "State" objects 
    ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item, list); 

    // Step 3: Tell the spinner about our adapter 
    spinner.setAdapter(spinnerArrayAdapter); 
    spinner.setOnItemSelectedListener(this); 


    setListAdapter(adapter); 
    ingredients.add((View)findViewById(R.layout.row_add_recipe)); 
    adapter.notifyDataSetChanged(); 
} 

Si muevo relacionados para llenar mi spinner con datos de la base de código, siempre me devuelve una NullPointerException ya que no es encontrado en mi diseño. Por eso es necesario para mantenerlo aquí y la solución añadiendo addHeaderView() a mi ListView parece estar bien, pero no tengo otra NullPointerException con respecto a mi disposición principal:

protected void onCreate(Bundle savedInstanceState) 
{ 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.add_recipe_form); 
    ListView mylistview = (ListView) findViewById(android.R.id.list); 
    LinearLayout myhead = (LinearLayout)findViewById(R.id.linear_form); 
    mylistview.addHeaderView(myhead); 
    spinner = (Spinner)myhead.findViewById(R.id.category_spinner); 

    Cursor cursor = mydb.getCategoriesList(); 
    ArrayList<Category> list = new ArrayList<Category>(); 
    list.add(new Category(0,"Choose a category")); 

    while (cursor.moveToNext()) { 
     list.add(new Category(cursor.getInt(0),cursor.getString(1))); 
    } 
    // Step 2: Create and fill an ArrayAdapter with a bunch of "State" objects 
    ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item, list); 

    // Step 3: Tell the spinner about our adapter 
    spinner.setAdapter(spinnerArrayAdapter); 
    spinner.setOnItemSelectedListener(this); 


    setListAdapter(adapter); 
    ingredients.add((View)findViewById(R.layout.row_add_recipe)); 
    adapter.notifyDataSetChanged(); 
} 
+0

'hacer que todos los elementos sean visibles sin desplazarse' ¿Qué sucede si tiene artículos que superan el tamaño de su pantalla? –

+0

¿podría explicarlo con más detalle? ¿Cómo se deben mostrar sus artículos cuando agrega demasiados elementos para que se muestre la pantalla (por ejemplo, agregó 100 elementos)? – Sprigg

+0

mi ListView está dentro de Linearlayout que tiene otros elementos adentro, que está en ScrollView. – dany84

Respuesta

4

Si he entendido bien, sólo necesita un poco más de vistas que se pueden desplazar junto con su lista de visitas. La mejor manera de implementarlo es llamar al addHeaderView() y addFooterView() en su ListView().

EDIT:

Debe ir así, creo:

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.your_main_layout); 
    LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View header = inflater.inflate(R.layout.your_header_layout); //R.layout, not R.id! 

    (ListView) list = findViewById(android.R.list); 
    list.addHeaderView(header); 

    list.setAdapter(adapter); //according to docs you should call setAdapter() after addHeaderView() 

    //to get the spinner 
    (Spinner) spinner = (Spinner) header.findViewById(R.id.spinner); 

} 

estoy escribiendo desde la memoria y no probarlo, pero creo que debería funcionar. Pruébelo cuando tenga un momento.

+0

Eso es interesante. Creé un nuevo archivo de diseño XML para mi cabeza, pero cuando uso este código: LinearLayout myhead = (LinearLayout) findViewById (R.id.linear_form); me devuelve "nulo". ¿Alguna idea? – dany84

+0

¿Dónde lo llamas? En 'onCreate()' de su actividad? –

+0

sí, lo llamo OnCreate(). Si pudiera ser útil, aquí es parte de mi función OnCreate(): setContentView (R.layout.add_recipe_form); \t \t ListView mylistview = (ListView) findViewById (android.R.id.list); \t \t LinearLayout myhead = (LinearLayout) findViewById (R.id.linear_form); \t \t mylistview.addHeaderView (myhead); – dany84

2

Una solución es hacer la altura ListView tan grande como el contenido. Puede conseguir este efecto utilizando la siguiente clase en lugar de ListView:

public class ExpandedListView extends ListView { 

    private int old_count = 0; 

    public ExpandedListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
    if (getCount() != old_count) { 
     old_count = getCount(); 
     int totalHeight = 0; 
     int desiredWidth = MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST); 
     for (int i = 0; i < getCount(); i++) { 
      View listItem = getAdapter().getView(i, null, this); 
      listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
      totalHeight += listItem.getMeasuredHeight(); 
     } 

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

    super.onDraw(canvas); 
    } 

} 

De todos modos, es una mala idea tener un ListView dentro de un ScrollView, por lo que me gustaría añadir los otros elementos en su diseño como un/Pie de página de cabecera con los métodos addHeaderView() y addFooterView() como señaló MichałK.

Aquí tienen un ejemplo sobre cómo utilizar estos métodos:

https://github.com/commonsguy/cw-advandroid/tree/master/ListView/HeaderFooter

+0

No es necesario obtener elementos específicos en la lista. 'addHeaderView()' y 'addFooterView()' hacen el truco más fácil. –

+0

¿Están estos encabezado/pie de página fijos y siempre visibles? Creo que quiere que todo sea desplazable. –

+0

Estos son desplazables, solo algunas vistas personalizadas agregadas como una fila a la lista. Además, puede agregar varios de ellos o simplemente colocar un 'LinearLayout' con otras vistas, por lo que es una solución agradable y personalizable –

1

Haga su altura ListView más grande que el tamaño de su contenido .

que si tienes 5 ListItems cada que tiene una altura 20SP conjunto de vista de lista altura de 100 o mayor esta manera se puede lograr

+0

De esta forma puede lograr un 'ListView' no desplazable, pero hay mejores formas de lograr el objetivo final que es tener algunas vistas alrededor de' ListView' y desplazarse a lo largo. Como ya se ha mencionado, poner 'ListView' dentro de' ScrollView' es una mala idea –

+1

Esto se puede lograr automáticamente con el ExpandedListView I copiado en la respuesta, pero está lejos de ser óptimo. –

+0

Obtengo una excepción ClassCastException tratando de modificar los parámetros de diseño de mi lista de lista cuando agrego un nuevo elemento. – dany84

Cuestiones relacionadas