Вызов notifyDataSetChanged() вызывает исключение

У меня есть ListView, который я привязываю к адаптеру. Адаптер является защищенным членом моего основного класса. У меня есть поток прослушивателя, который получает данные и обновляет список источников для моего адаптера. Когда я вызываю метод адаптера notifyDataSetChanged(), возникает исключение:

Исключение времени выполнения: PhoneLayoutInflater(LayoutInflater).inflate(int, ViewGroup, boolean) строка: 322

Я читал, что метод notifyDataSetChanged() должен вызываться в потоке пользовательского интерфейса, и я это делаю. На самом деле, просто чтобы быть уверенным, я даже обновляю источник данных ListView в потоке пользовательского интерфейса. Все, что я делаю в своем потоке слушателя, — это обновляю защищенный член, в котором хранятся данные. Вот пример того, что я делаю (обратите внимание, что у меня нет части кода, которая вызывает AsyncTask, но она запускается слушателем):

public class main extends Activity() {

 protected LinkedList<HashMap<String, String>> adapterDataList = new LinkedList<HashMap<String, String>>();
 protected MyDataObject dataObject;
 protected SimpleAdapter dataAdapter;

 @Override
 public void onCreate(Bundle savedInstanceState) {

     //call parent oncreate
     super.onCreate(savedInstanceState);

  //display the main form
  setContentView(R.layout.main);

  //get a handle on the score list view elements
  ListView dataList = (ListView)(findViewById(R.id.datalist));

  //link the adapter and the data source
  dataAdapter = new SimpleAdapter(this, adapterDataList, R.layout.row, new String[]{"name","address"}, new int[]{R.id.username,R.id.address});

  dataList.setAdapter(dataAdapter);

 }

 protected void refreshData() {
  adapterDataList.clear();
  Iterator<MyData> iter = MyDataObject.iterator();
  while(iter.hasNext()) {
   HashMap<String, String> item = new HashMap<String, String>()
   item.put("name", iter.name);
   item.put("address", iter.address);
   adapterDataList.add(item);
  }

  dataAdapter.notifyDataSetChanged();
 }

 private class DataTask extends AsyncTask<Data, Void, Data> {
  protected void onPostExecute(Data data) {
   dataObject = data;
   runOnUiThread (new Runnable() { public void run() {
    refreshScores();
   }});
  }
 }

 ...
}

У кого-нибудь есть какие-либо указатели или идеи относительно того, почему я получаю это исключение? Любая помощь очень ценится.

изменить Вот файлы макета, как и просили: main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ptl="http://schemas.android.com/apk/res/com.mod0.pubtrivialive"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/datalistcontainer">

    <ListView android:id="@+id/datalist" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

</LinearLayout>

строка.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  android:paddingBottom="6dip"
  android:paddingTop="4dip">

  <TextView android:id="@+id/name"
  android:layout_width="80dip"
  android:layout_height="wrap_content" />

  <TextView android:id="@+id/address"
  android:layout_height="wrap_content"
  android:layout_weight="1" />

</LinearLayout>

person Matt    schedule 07.10.2010    source источник
comment
Вы можете рассмотреть возможность публикации файла макета строки.   -  person CommonsWare    schedule 07.10.2010
comment
Спасибо, я добавил макеты выше.   -  person Matt    schedule 07.10.2010
comment
Вам нужно опубликовать больше кода. Вы используете кучу переменных, которые не определили adapterDataList.add(item);   -  person Falmarri    schedule 07.10.2010


Ответы (1)


Это выглядит неправильно dataList.clear();. Вы уверены, что имеете в виду очистку dataList, а не adapterDataList?

person Falmarri    schedule 07.10.2010
comment
Извините, я снова отредактировал. Я изменил имена переменных, чтобы было понятнее, и перепутал эту часть. Я добавляю каждый элемент, созданный внутри цикла while, в список данных, а затем вызываю notifyDataSetChanged() на адаптере. Я вызываю dataList.clear() перед циклом while, чтобы удалить старые данные и заполнить их новыми данными. - person Matt; 07.10.2010
comment
Вы настроены на использование SimpleAdapter? Я бы рекомендовал создать собственный класс адаптера, расширяющий либо BaseAdapter, либо ArrayAdapter. - person Falmarri; 07.10.2010
comment
Я могу сделать это; Я просто надеялся, что все будет, э-э, просто. :) Я отчитаюсь, смогу ли я использовать кастомный адаптер. - person Matt; 07.10.2010
comment
Обычно, когда вам нужно добавлять/удалять представления, изменять что-то и вообще возиться со списком, вам, вероятно, следует реализовать свои собственные вещи. - person Falmarri; 07.10.2010
comment
Реализация моего собственного взгляда действительно помогла. Это заставило меня войти туда и действительно понять, как все работает. FWIW, причина, по которой инфлятор выдавал исключение, заключалась в том, что адрес TextView не имел атрибута ширины, который требуется. Я узнал об этом, только выполнив try/catch в методе getView адаптера и зарегистрировав исключение, что было возможно только потому, что я создал свой собственный адаптер. Спасибо за советы! - person Matt; 09.10.2010
comment
Ну что ж. Я рад, что смог помочь, но я даже толком не прочитал исключение ›_‹. Вы должны опубликовать ответ об отсутствии необходимых атрибутов в ответе, а затем принять это. Это более актуальный ответ. - person Falmarri; 09.10.2010