Android ListView addHeaderView () nullPointerException для предопределенных представлений, определенных в XML - PullRequest
21 голосов
/ 20 октября 2011

Попытка использовать 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 Ответ

101 голосов
/ 20 октября 2011

РЕДАКТИРОВАТЬ:

вы просто не можете сделать

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)); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...