Возможно ли иметь сам порядок FirebaseUI ListView по свойству локальной модели данных (в данном случае Person.class), а не по значению, содержащемуся в базе данных... в режиме реального времени?
Проблема: я конвертирую сильно привязанное к местоположению приложение (похожее на приложение для совместного использования) с PHP/mysql на firebase. (Кстати, я очень взволнован Firebase... и я уже увидел много преимуществ).
Для наших целей приложение просто отображает список, отображающий ближайших и доступных поставщиков услуг, упорядоченных по расстоянию. Раньше это делалось путем отправки на сервер PHP-запроса, включающего широту и долготу клиента в качестве параметров POST. Затем сервер отправляет обратно список поставщиков услуг в формате JSON. Сервер будет выполнять математические расчеты, упорядочивая результаты на основе текущего расстояния поставщика услуг до клиента. Кроме того... поставщики услуг, которые недоступны, вообще не возвращаются. Проблема со всем этим в том, что пользователю по-прежнему нужно «потянуть, чтобы обновить».
Подход Firebase работает до сих пор, но я смог отфильтровать свой список (с поддержкой FirebaseUI) только по доступности поставщика услуг (см. код), но я не смог придумать, как упорядочить список по расстоянию.
В приведенном ниже коде показано, что я пытаюсь сделать. Класс Person представляет поставщиков услуг.
Итак... скажем, класс Person имеет переменную Person.distance и метод getDistance(), который возвращает рассчитанное расстояние между их местоположением (из базы данных Firebase) и местоположением, хранящимся в данный момент в телефоне пользователя приложения. Очевидно, что эту переменную нельзя хранить в базе данных и использовать в качестве сопоставимого значения, поскольку она является относительной и зависит от местонахождения как пользователя, так и поставщика услуг.
Есть ли способ добиться этого, используя представление переработчика? Я бы предположил, что это будет что-то сделано внутри адаптера... но все это уже завернуто в FirebaseUI... и я недостаточно хорош в кодировании, чтобы переписать классы библиотеки Android. Спасибо за любую помощь.
Соответствующий код (работает нормально... это не проблема... сначала прочитайте сообщение):
ref = FirebaseDatabase.getInstance().getReference().child("person");
Query orderedByAvail_Query = ref.orderByChild("available").equalTo(true);
FirebaseListAdapter<Person> fireAdapter = new FirebaseListAdapter<Person>(getActivity(),
Person.class, R.layout.single_row, orderedByAvail_Query) {
@Override
protected void populateView(View v, Person person, int position) {
TextView name_title = (TextView) v.findViewById(R.id.Nickname);
name_title.setText(person.getNickname());
if (person.getAvail()){
name_title.setBackgroundColor(Color.GREEN);
} else {
name_title.setBackgroundColor(Color.WHITE);
}
}
};
// Arraylist<Person> tempList4Sorting = new ArrayList<Person>;
// for (i=1 to fireAdapter.size){
// tempList4Sorting.add(fireAdapter.getItem(i);
// i++;
// }
// Collections.sort(tempList4Sorting, Person.distance, DESCENDING);
// fireAdapter.clearItems();
//
// put sorted items back into the adapter using another for loop
// fireAdapter.notifyDataSetChanged (?)
setListAdapter(fireAdapter);