2014-11-03 3 views
0

Я создаю приложение, которое является динамически заполняющим/депопуляционным arraylist в зависимости от потока Futuretask, который взаимодействует с сервером.ArrayAdapter обновляющие данные

Проблема заключается в том, что, когда я добавить новый объект в мое arrayadapter и в любом случае я называю notifyDataSetChanged или setNotifyOnChange

(например, после добавления элемента, я также пытался сделать некоторую postadd функции, которая вызывает notifyDataSetChanged или даже пытался добавить setNotifyOnChange в конструктор адаптера, или перед добавлением (adapter.setNotifyOnChange (правда)))

в этом FutureTask он просто замерзает нить и вызывает сбой приложения. Без уведомления об изменении, когда я скольжу пальцем, чтобы вызвать getView(), он работает, но это нежелательное поведение.

Примечание: Я обращаюсь к адаптеру с помощью ссылки на статические переменные.

Примечание № 2: Я не думаю, что создание нового адаптера снова и снова является разумным выбором.

/редактировать:

Мой метод удалить выглядит следующим образом:

public void remove (int itemid) { 
     for (ContactItem i : items) 
      if (i.ID == itemid) 
       items.remove(i); 
    } 

(и он висит в конце концов на последнем pharantesis)

ответ

0
  1. Использование статической переменной ссылки означает, что вы должен быть осторожно в резьбе. Насколько я знаю, адаптер обновляет данные только в потоке пользовательского интерфейса.
  2. Еще одна вещь, которую вы должны знать, - вы должны реализовать функцию getCount(), чтобы вернуть правильный номер. У меня возникла проблема, когда мой список не обновляет мои данные. даже я запускаю onDatasetChange(). Я забыл функцию GetCount()
1
  1. Передайте слабую ссылку на деятельность в вашем другом потоке, так что вы не просочиться контекст.

    WeakReference<Activity> mRef_Activity = new WeakReference<Activity>(activity); 
    
  2. Из этого потока, запустить обновление уведомляет о Ui нити основной деятельности.

    final Activity activity = mRef_Activity.get(); 
        if(activity != null) 
         activity.runOnUiThread(new Runnable() { 
    
          @Override 
          public void run() { 
    
           ArrayAdapter<String> adapter = activity.getAdapter(); 
           adapter.notifyDataSetChanged(); 
    
          } 
         }); 
    

Примечания, если вы работаете задачу асинхронной, а вызываемый или работоспособный, вы можете просто поставить уведомите обновление в postExecute в асинхронном, так как это обратный вызов от основного потока пользовательского интерфейса.

+0

Здравствуйте, ваш ответ помог мне поблагодарить вас, но я также испытываю очень странную ошибку. Я также добавил setNotifyOnChange (false); к конструктору адаптера, поэтому его не следует называть неявным, когда я пытаюсь добавить/удалить из списка, но иногда этот вызов возникает, когда я удаляю и все приложение зависает, когда я нажимаю экран, это то, что я получаю. – Smarty77

+0

java.lang.IllegalStateException: содержимое адаптера изменилось, но ListView не получил уведомление. Убедитесь, что содержимое адаптера не изменено из фонового потока, но только из потока пользовательского интерфейса. Убедитесь, что ваш адаптер вызывает notifyDataSetChanged() при изменении его содержимого.[в ListView (2131427350, класс android.widget.ListView) с адаптером (класс censored.ui.adapters.ContactsAdapter)] – Smarty77

+0

Документация для упомянутой функции: «Если установлено значение« ложно », вызывающий должен вручную вызвать notifyDataSetChanged(), чтобы иметь изменения, отраженные в прикрепленном виде. Значение по умолчанию - true, а вызов notifyDataSetChanged() сбрасывает флаг в true. " Кажется, вам нужно сбросить его после вызова notifyDataSetChanged(). – NameSpace

Смежные вопросы