Android ListView addHeaderView()用于在XML中定义的预定义视图的nullPointerException

尝试为ListView使用addHeaderView()addFooterView() 。 如果我尝试使用我已经预定义的XML的头或页脚,我得到一个空指针exception。 但是,如果我使用代码dynamic创build一个视图,它可以正常工作…

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

我的堆栈跟踪:

 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 

任何线索?

Solutions Collecting From Web of "Android ListView addHeaderView()用于在XML中定义的预定义视图的nullPointerException"

编辑:

你根本做不到

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

这是行不通的,因为正在通过的视图has to be inflated 。 简而言之,当您在活动开始时执行setContentView时, android框架将自动膨胀视图并将其放入使用中 。 为了膨胀你的头部视图,你所要做的就是

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

最后,在设置标题视图并运行应用程序后添加适配器。 您应该看到您的标题视图与您放入适配器的内容。

在我的情况下,这工作

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