2012-06-12 29 views
5

Principiante di Android qui. Stavo giocando con ListViews, cercando di crearli dinamicamente al posto del file XML. Osservo il seguente comportamento strano nel mio codice.Creazione di ListView a livello di programmazione

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); 

} 


} 

Fondamentalmente per prima cosa creo un oggetto LinearLayout e quindi creo un oggetto ListView come uno dei suoi figli. Ho osservato che le voci dell'elenco così create non sono selezionabili. Ma se scrivo

setContentView(lv); 

invece di

setContentView(ll); 

le voci di elenco sono cliccabili. Qualcuno può spiegare questo? Come faccio a rendere selezionabili gli elementi della lista se devo implementare la mia classe in questo modo? Non voglio andare in modalità 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

Il tuo codice sembra buono, l'ho anche compilato per essere sicuro, ma l'OnItemClickListener viene eseguito come promesso ... – Sam

+0

Cosa succede se imposti la visualizzazione del contenuto e poi aggiungi la listvieww? – Barak

+0

No, ancora non funziona. L'elenco viene visualizzato correttamente ma gli elementi dell'elenco non sono selezionabili. – VJune

risposta

6

modificare il codice:

ll.addView(lv); 

a questo:

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

Problema risolto, credo, si deve dare il ListView un qualche tipo di restrizione di layout o definizione, quindi può funzionare correttamente.

+0

hmm ... funziona, ma rendere la larghezza e l'altezza della vista del bambino uguale a -1 è un po 'strano. Non pensi? – VJune

+0

Perché strano? -1 significa View.FILL_PARENT, penso che sia ragionevole. Scusa, forse non l'ho chiarito, puoi scrivere così: ll.addView (lv, View.FILL_PARENT, View.FILL_PARENT); –

+0

ok vedo ora ... grazie :) – VJune

2

sono stato in grado di ottenere questo lavoro, ma ho dovuto creare la LinearLayout in XML, che mi rendo conto che è diverso da come lo avete. Tuttavia, dato che in entrambi i casi LinearLayout è l'elemento radice e dato che si sta ancora creando ListView a livello di codice, in realtà non dovrebbe fare alcuna differenza IMHO.

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

La mia domanda era intesa più a capire il comportamento del mio programma. Supposi che esistessero sicuramente implementazioni alternative. Ma grazie per la tua risposta. – VJune

Problemi correlati