Чтобы иметь возможность инициализировать адаптер, вам необходимо иметь действительный запрос. И чтобы создать запрос, вам нужно иметь searchData
. Это означает, что инициализация firebaseRecyclerAdapter
должна происходить внутри onClick
.
imgB.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view)
{
query = mProfileDatabase.orderByChild("djprofile")
.startAt(searchData)
.endAt(searchData + "\uf8ff");
FirebaseRecyclerOptions<DjProfile> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<DjProfile>()
.setQuery(query, DjProfile.class)
.build();
firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<DjProfile, ResultsViewHolder>(firebaseRecyclerOptions)
{
@NonNull
@Override
public ResultsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.searchitem_list, viewGroup, false);
return new ResultsViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull ResultsViewHolder holder, int position, @NonNull DjProfile model) {
holder.setDjProfile(model);
}
};
recyclerView.setAdapter(firebaseRecyclerAdapter);
}
});
Вот то, как я делаю это.
Можно получить список города, Св., почтовых индексов и их широт и долгот. (Я не могу вспомнить первое, что пришло на ум, где мы получили наш),
править: http://geonames.usgs.gov/domestic/download_data.htm как кто-то упомянутый выше, вероятно, работал бы.
Затем можно записать метод для вычисления минуты и макс. широты и долгот на основе радиуса и запроса для всех городов между теми минутами и максимум. Затем цикл через и вычисляет расстояние и удаляет любого, которые не находятся в радиусе
double latitude1 = Double.parseDouble(zipCodes.getLatitude().toString());
double longitude1 = Double.parseDouble(zipCodes.getLongitude().toString());
//Upper reaches of possible boundaries
double upperLatBound = latitude1 + Double.parseDouble(distance)/40.0;
double lowerLatBound = latitude1 - Double.parseDouble(distance)/40.0;
double upperLongBound = longitude1 + Double.parseDouble(distance)/40.0;
double lowerLongBound = longitude1 - Double.parseDouble(distance)/40.0;
//pull back possible matches
SimpleCriteria zipCriteria = new SimpleCriteria();
zipCriteria.isBetween(ZipCodesPeer.LONGITUDE, lowerLongBound, upperLongBound);
zipCriteria.isBetween(ZipCodesPeer.LATITUDE, lowerLatBound, upperLatBound);
List zipList = ZipCodesPeer.doSelect(zipCriteria);
ArrayList acceptList = new ArrayList();
if(zipList != null)
{
for(int i = 0; i < zipList.size(); i++)
{
ZipCodes tempZip = (ZipCodes)zipList.get(i);
double tempLat = new Double(tempZip.getLatitude().toString()).doubleValue();
double tempLon = new Double(tempZip.getLongitude().toString()).doubleValue();
double d = 3963.0 * Math.acos(Math.sin(latitude1 * Math.PI/180) * Math.sin(tempLat * Math.PI/180) + Math.cos(latitude1 * Math.PI/180) * Math.cos(tempLat * Math.PI/180) * Math.cos(tempLon*Math.PI/180 -longitude1 * Math.PI/180));
if(d < Double.parseDouble(distance))
{
acceptList.add(((ZipCodes)zipList.get(i)).getZipCd());
}
}
}
Существует выборка моего кода, надо надеяться, Вы видите то, что происходит. Я начинаю с одним ZipCodes (таблица в моем DB), затем я задерживаю возможные соответствия, и наконец я избавляюсь от тех, кто не находится в радиусе.
Oracle, PostGIS, mysql с расширениями GIS, sqlite с расширениями GIS вся поддержка этот вид запросов.
Если у Вас нет взгляда набора данных на:
У меня нет веб-сайта, но мы реализовали это и в Oracle как функция базы данных и в SAS как макрос статистики. Это только требует базы данных со всеми городами и их lat и долго.
Смотрите на этот веб-сервис, рекламируемый на xmethods.net. Это требует, чтобы подписка на самом деле использовала, но утверждает, что сделало то, в чем Вы нуждаетесь.
Рекламируемый метод в описании вопроса:
Возвраты GetPlacesWithin список гео-мест на указанном расстоянии от данного места. Параметры: место - название места (65 символов макс.), состояние - 2 кода состояния буквы (не требуемый для почтовых индексов), расстояние - расстояние в милях, placeTypeToFind - тип места для поиска: ZipCode или Город (включая любые деревни, города, и т.д.).
http://xmethods.net/ve2/ViewListing.po?key=uuid:5428B3DD-C7C6-E1A8-87D6-461729AF02C0
Можно получить довольно хорошую базу данных определенных геолокацию городов/топонимов из http://geonames.usgs.gov - находят соответствующий дамп базы данных, импортируют его в DB и выполнение вида запроса потребность довольно проста, особенно если DBMS поддерживает некоторые пространственные запросы (например, как Пространственная Oracle, MySQL Spatial Extensions, PostGIS или 2008 SQLServer)