Моя реализация 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);
}
Вы вызываете 'onObjectStateChanged' из потока пользовательского интерфейса? – Rohit5k2
@ Rohit5k2: Да, если бы я этого не сделал, это создало бы исключение. – Ashwin
Каково определение вашего объекта ObjectStateListener? –