2012-06-12 10 views
5

Principiante de Android aquí. Estaba jugando con ListViews, tratando de crearlos dinámicamente en lugar del archivo XML. Observé el siguiente comportamiento extraño en mi código.Crear ListView programmatically

public class SettingsHolder extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    LinearLayout ll = new LinearLayout(this); 
    ListView lv = new ListView(this); 
    String[] values = new String[10]; 
    for(int i=0;i<10;i++){ 
     values[i] = ""+i; 
    } 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, values); 
    lv.setAdapter(adapter); 
    lv.setOnItemClickListener(new OnItemClickListener(){ 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      //Toast.makeText(getBaseContext(), ""+arg2,  Toast.LENGTH_SHORT).show(); 
      Log.d("DEBUG", ""+arg2); 

     } 

    }); 

    ll.addView(lv); 
    setContentView(ll); 

} 


} 

Básicamente, en primer lugar crear un objeto LinearLayout y luego crea un objeto ListView como uno de sus hijos. Observé que no se puede hacer clic en los elementos de la lista así creados. Pero si escribo

setContentView(lv); 

en lugar de

setContentView(ll); 

los elementos de la lista se puede hacer clic. ¿Alguien puede explicar esto? ¿Cómo puedo hacer clic en los elementos de la lista si tengo que implementar mi clase de la última manera? No quiero ir al modo ListActivity.

list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp" 
    android:textSize="16sp" > 
</TextView> 
+0

Su código se ve bien, incluso compilé para estar seguro, pero el OnItemClickListener se ejecuta como prometió ... – Sam

+0

¿Qué ocurre si establece la vista de contenido y luego agrega el listvieww? – Barak

+0

No, todavía no funciona. La lista se muestra bien, pero los elementos de la lista no se pueden hacer clic. – VJune

Respuesta

6

cambiar su código:

ll.addView(lv); 

a esto:

ll.addView(lv, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 

Problema resuelto, supongo, que tiene que dar la vista de lista algún tipo de restricción de diseño o definición, por lo que puede funcionar correctamente.

+0

hmm ... funciona, pero hacer el ancho y la altura de la vista infantil igual a -1 es un poco extraño. ¿No crees? – VJune

+0

¿Por qué extraño? -1 significa View.FILL_PARENT, creo que es razonable. Lo siento, tal vez no lo dejé claro, puedes escribir así: ll.addView (lv, View.FILL_PARENT, View.FILL_PARENT); –

+0

ok ahora veo ... gracias :) – VJune

2

pude conseguir que esto funcione, pero tenía que crear el LinearLayout en XML, que me di cuenta es diferente a la forma en que lo tienes. Sin embargo, dado que de cualquier manera LinearLayout es el elemento raíz, y dado que todavía está creando el ListView programáticamente, realmente no debería hacer ninguna diferencia en mi humilde opinión.

public class ExampleActivity extends Activity implements OnItemClickListener { 

private LinearLayout ll; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.your_layout); 
    ll = (LinearLayout) findViewById(R.id.main_ll); 
    ListView lv = new ListView(this); 
    ll.addView(lv); 

    String[] values = new String[10]; 
    for (int i = 0; i < 10; i++) { 
     values[i] = "" + i; 
    } 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, values); 
    lv.setAdapter(adapter); 
    lv.setOnItemClickListener(this); 
} 

@Override 
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
    Toast.makeText(this, "" + arg2, Toast.LENGTH_SHORT).show(); 
    Log.d("DEBUG", "" + arg2); 
} 

}

+0

Mi pregunta fue pensada más para comprender el comportamiento de mi programa. Supuse que las implementaciones alternativas definitivamente existirían. Pero gracias por tu respuesta. – VJune