Android ListView addHeaderView() nullPointerException для предопределенных представлений, определенных в XML
Попытка использовать addHeaderView()
и addFooterView()
для ListView
. Если я попытаюсь использовать представление, которое я предопределл в XML для верхнего или нижнего колонтитула, я получаю исключение с нулевым указателем. Однако, если я динамически создаю View, используя код, он отлично работает...
// 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
Любые подсказки?
Ответы
Ответ 1
EDIT:
вы просто не можете сделать
View header = findViewById(R.layout.headerView);
lst.addHeaderView(header);
Это НЕ работает, потому что представление, которое передается в has to be inflated
. В двух словах, когда вы делаете setContentView
в начале вашей активности , андроидная структура автоматически раздувает представление и помещает его в использование. Чтобы раздуть ваш заголовок, все, что вам нужно сделать, это
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));