2011-10-20 10 views
19

Intentando usar addHeaderView() y addFooterView() para un ListView. Si trato de usar una Vista que he predefinido en XML para el encabezado o el pie de página, obtengo una excepción de puntero nulo. Sin embargo, si dinámicamente crear una vista usando el código, que funciona bien ...Android ListView addHeaderView() nullPointerException para vistas predefinidas definidas en XML

// This doesn't work... nullPointerException 
ListView lv = (ListView) findViewById(R.id.my_list_view); 
TextView header = (TextView) findViewById(R.id.my_header); 
lv.addHeaderView(header); 

// This works fine 
ListView lv = (ListView) findViewById(R.id.my_list_view); 
TextView header = new TextView(this); 
TextView.setHeight(30); 
TextView.setText("my header text!"); 
lv.addHeaderView(header); 

Mi Seguimiento de la pila:

Caused by: java.lang.NullPointerException 
    at android.widget.ListView.clearRecycledState(ListView.java:522) 
    at android.widget.ListView.resetList(ListView.java:508) 
    at android.widget.ListView.setAdapter(ListView.java:440) 
    at com.company.myapp.MyActivity.refreshList(MyActivity.java:85) 
    at com.company.myapp.MyActivity.onCreate(MyActivity.java:37) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
    ... 11 more 

Alguna pista?

Respuesta

97

EDIT:

usted simplemente no puede hacer

View header = findViewById(R.layout.headerView); 
lst.addHeaderView(header); 

esto no funcionará porque el punto de vista que se está pasando en has to be inflated. En resumen cuando haces setContentView al comienzo de tu actividad el android framework automáticamente infla la vista y la pone en uso. Con el fin de inflar su vista de encabezado, todo lo que tiene que hacer es

View header = (View)getLayoutInflater().inflate(R.layout.headerView,null); 
ls.addHeaderView(header); 

por último, añadir el adaptador después de configurar la vista de encabezado y ejecutar la aplicación. Debería ver su vista de encabezado con el contenido que coloca en su adaptador.

En mi caso, esto funciona

View header = getLayoutInflater().inflate(R.layout.header, null); 
View footer = getLayoutInflater().inflate(R.layout.footer, null); 

ListView listView = getListView(); 

listView.addHeaderView(header); 
listView.addFooterView(footer);  

setListAdapter(new ArrayAdapter<String(this,android.R.layout.simple_list_item_single_choice,android.R.id.text1, names)); 
+0

Eso parece funcionar. Es realmente extraño que funcione bien con elementos creados dinámicamente. No estoy seguro de por qué tengo que saltar a través del aro de inflado de diseño aquí. Además, este método parece ignorar los márgenes que he establecido en el xml de mi Vista ... –

+0

¿Puedes intentar poner esa vista de texto en un diseño diferente y luego inflarlo y luego usarlo para establecer la vista de encabezado y pie de página? – user370305

+1

Eso funcionó. Acabo de envolver mi 'TextView' en un' LinearLayout'. Voy a marcar esto como mi respuesta, pero me gustaría saber por qué tuve que saltar por los aros para que funcione. No puedo decir si es un error o qué. ¡Gracias! –

Cuestiones relacionadas