2015-01-27 3 views
1

Моя реализация ArrayAdapter такова, что она прослушивает изменения под лежащих данных. Таким образом, любые изменения в данных, адаптер уведомлен и он вызывает notifydataSetChanged()Вызов notifyDataSetChanged() изнутри адаптера

public class MyAdapter extends ArrayAdapter implements ObjectStateListener { 

    @Override 
    public void onObjectStateChanged() { 
     /*Call appropriate functions as the underlying data as changed. 
     A good way of doing that would be to retrieve only the positions of the filtered values 
     so that the original dataholder can be used but display only certain indices 
     */ 
     Log.v(TAG, "FilterCriteria changed. Trigger fired"); 
     this.filterPositions = Helper().getFilteredPositions(filterCriteria, mAppartments); 

     Log.v(TAG, "CALLING NOTIFYDATASETCHANGED()..."); 
     notifyDataSetChanged(); 
     Log.v(TAG, "FINISHED CALLING NOTIFY DATASET CHANGED"); 

    } 
} 

В приведенном выше коде функция onObjectStateChanged() вызывается всякий раз, когда есть изменение в данных и в свою очередь это вызывает notifyDataSetChanged(). Чтобы проверить, правильно ли вызывается onObjectStateChanged(), я поставил кучу операторов журнала, как вы можете видеть. Все эти журналы отображаются в logcat. Но getView() не получает вызов после звонка notifyDataSetChanged(), и поэтому listview не обновляется.

Почему это происходит? notifyDataSetChanged() должен гарантировать, что вызывается getView(), и новые данные отражаются в ListView вправо?

Определение ObjectStateChangeListener

public interface ObjectStateListener { 

    public void onObjectStateChanged(); 
    public void listenForStateChange(Object o); 
} 
+0

Вы вызываете 'onObjectStateChanged' из потока пользовательского интерфейса? – Rohit5k2

+0

@ Rohit5k2: Да, если бы я этого не сделал, это создало бы исключение. – Ashwin

+0

Каково определение вашего объекта ObjectStateListener? –

ответ

-1

При удалении или вставке нового значения в списке, то всякий раз, когда есть изменение в списке адаптер notifystatechange() будет называться так только после вставки или удаления значения call notifystatechange() он обновит список.

+0

Что случилось с текущей реализацией? – Ashwin

+1

@Pranav: вы просто указываете, где пользователю метод, а не точно решить проблему. Не полезно. – Rohit5k2

-1

Мне пришлось прекратить использование notifyDataSetChanged() в моем AutoCompleTextViews, так как они также не освежают. Я просто сохраняю локальную копию адаптера и затем сбрасываю его с новым набором данных, когда он изменяется.

Убедитесь, что ваш ArrayAdapter установлен для уведомления об изменении (это по умолчанию), и вы технически не должны даже сделать этот призыв к notifyDataSetChanged() на основе документации: http://developer.android.com/reference/android/widget/ArrayAdapter.html

-1

Первое обновление данных, где вы сохранили ссылку в адаптере, а затем вызываете notifyDataSetChanged(). Вам также придется передавать новые данные.

+2

Это должен был быть комментарий. – Rohit5k2

+0

@ Rohit5k2 Это не должно было быть комментарий. –

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