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

Jak*_*son 21 android listview exception

试图使用addHeaderView()addFooterView()ListView.如果我尝试使用我在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);
Run Code Online (Sandbox Code Playgroud)

我的堆栈跟踪:

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
Run Code Online (Sandbox Code Playgroud)

有线索吗?

use*_*305 101

编辑:

你根本做不到

View header = findViewById(R.layout.headerView);
lst.addHeaderView(header);
Run Code Online (Sandbox Code Playgroud)

这将无法正常工作,因为正在传入的视图has to be inflated.简而言之,当你setContentView在活动开始时,android框架会自动膨胀视图并将其投入使用.为了扩展标题视图,您只需要做的就是

View header = (View)getLayoutInflater().inflate(R.layout.headerView,null);
ls.addHeaderView(header);
Run Code Online (Sandbox Code Playgroud)

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

在我的情况下,这是有效的

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)); 
Run Code Online (Sandbox Code Playgroud)