У меня проблема с реализацией объединенного местоположения, какой метод используется для получения текущего местоположения устройства в пользовательском интерфейсе базы данных Firebase, но он не работает, потому что была красная линия, которая заметила
Cannot resolve method 'addOnSuccessListener(anonymous com.firebase.ui.database.FirebaseRecyclerAdapter<co.id.roningrum.dolanapptugasakhir.item.CategoryItem,co.id.roningrum.dolanapptugasakhir.adapter.CategoryViewHolder>, anonymous com.google.android.gms.tasks.OnSuccessListener<android.location.Location>)
Есть три класса, которые я уже сделал, CategoryItem, CategoryViewHolder и CategoryMenuActivity.CategoryItem - это класс модели, CategoryViewHolder - это класс ViewHolder, а CategoryMenuActivity - это класс активности, который используется для отображения списка элементов.
- CategoryItem.java
public class CategoryItem {
private String name_tourism;
private String location_tourism;
private String info_tourism;
private String telepon;
private String url_photo;
private double lat_location_tourism;
private double lng_location_tourism;
public CategoryItem() {
//constructor untuk panggilan ke DataSnapshot.getValue
}
public CategoryItem(String name_tourism, String location_tourism, String info_tourism, String telepon, String url_photo, double lat_location_tourism, double lng_location_tourism) {
this.name_tourism = name_tourism;
this.location_tourism = location_tourism;
this.info_tourism = info_tourism;
this.telepon = telepon;
this.url_photo = url_photo;
this.lat_location_tourism = lat_location_tourism;
this.lng_location_tourism = lng_location_tourism;
}
public String getName_tourism() {
return name_tourism;
}
public void setName_tourism(String name_tourism) {
this.name_tourism = name_tourism;
}
public String getLocation_tourism() {
return location_tourism;
}
public void setLocation_tourism(String location_tourism) {
this.location_tourism = location_tourism;
}
public String getInfo_tourism() {
return info_tourism;
}
public void setInfo_tourism(String info_tourism) {
this.info_tourism = info_tourism;
}
public String getTelepon() {
return telepon;
}
public void setTelepon(String telepon) {
this.telepon = telepon;
}
public String getUrl_photo() {
return url_photo;
}
public void setUrl_photo(String url_photo) {
this.url_photo = url_photo;
}
public double getLat_location_tourism() {
return lat_location_tourism;
}
public void setLat_location_tourism(double lat_location_tourism) {
this.lat_location_tourism = lat_location_tourism;
}
public double getLng_location_tourism() {
return lng_location_tourism;
}
public void setLng_location_tourism(double lng_location_tourism) {
this.lng_location_tourism = lng_location_tourism;
}
}
CategoryViewHolder.java
package co.id.roningrum.dolanapptugasakhir.adapter;
import android.location.Location;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import java.text.DecimalFormat;
import co.id.roningrum.dolanapptugasakhir.R;
import co.id.roningrum.dolanapptugasakhir.item.CategoryItem;
public class CategoryViewHolder extends RecyclerView.ViewHolder {
private TextView name_tourisms, location_tourism, distance_tourism;
private ImageView tourism_pic;
public CategoryViewHolder(@NonNull View itemView) {
super(itemView);
name_tourisms = itemView.findViewById(R.id.tv_name_tourism);
location_tourism = itemView.findViewById(R.id.tv_location_tourism);
distance_tourism= itemView.findViewById(R.id.tv_distance_tourism);
tourism_pic = itemView.findViewById(R.id.tourism_pic);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
categoryOnClick.onItemClick(v, getAdapterPosition());
}
});
}
public void showTourismData(CategoryItem categoryItem, double longitude, double latitude) {
Location loc1 = new Location("");
loc1.setLatitude(latitude);
loc1.setLongitude(longitude);
Location loc2 = new Location("");
loc2.setLatitude(categoryItem.getLat_location_tourism());
loc2.setLongitude(categoryItem.getLng_location_tourism());
float jarakMeter = loc1.distanceTo(loc2);
float jarakKM = jarakMeter/1000;
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
name_tourisms.setText(categoryItem.getName_tourism());
location_tourism.setText(categoryItem.getLocation_tourism());
distance_tourism.setText(""+df.format(jarakKM)+" KM");
Glide.with(itemView.getContext()).load(categoryItem.getUrl_photo()).into(tourism_pic);
}
//interface
private CategoryViewHolder.ClickListener categoryOnClick;
public interface ClickListener{
void onItemClick (View view, int position);
}
public void setOnClickListener(CategoryViewHolder.ClickListener clickListener){
categoryOnClick = clickListener;
}
}
//}
CategoryMenuActivity.java
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import java.util.ArrayList;
import co.id.roningrum.dolanapptugasakhir.adapter.CategoryViewHolder;
import co.id.roningrum.dolanapptugasakhir.item.CategoryItem;
public class CategoryMenuActivity extends AppCompatActivity {
Toolbar mToolbar;
DatabaseReference tourismDBRef;
RecyclerView rvTourismList;
ArrayList<CategoryItem> categoryItemList;
FirebaseRecyclerAdapter<CategoryItem, CategoryViewHolder> firebaseAdapter;
LocationManager locationManagers;
String[] perms = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_NETWORK_STATE};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_category_menu);
mToolbar = findViewById(R.id.toolbar_top);
rvTourismList = findViewById(R.id.tourism_list);
rvTourismList.setLayoutManager(new LinearLayoutManager(this));
categoryItemList = new ArrayList<>();
setSupportActionBar(mToolbar);
locationManagers = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
tourismDBRef = FirebaseDatabase.getInstance().getReference();
Query query = tourismDBRef.child("Tourism");
FirebaseRecyclerOptions<CategoryItem> options = new FirebaseRecyclerOptions.Builder<CategoryItem>()
.setQuery(query, CategoryItem.class)
.build();
firebaseAdapter = new FirebaseRecyclerAdapter<CategoryItem, CategoryViewHolder>(options) {
@NonNull
@Override
public CategoryViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_category_menu, viewGroup, false);
return new CategoryViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final CategoryViewHolder holder, int position, @NonNull final CategoryItem model) {
final DatabaseReference touristRef = getRef(position);
final String wiskey = touristRef.getKey();
FusedLocationProviderClient mFusedLocation = LocationServices.getFusedLocationProviderClient(getApplicationContext());
if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
verifyPermission();
return;
}
mFusedLocation.getLastLocation().addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if (location != null) {
// Do it all with location
Log.d("My Current location", "Lat : " + location.getLatitude() + " Long : " + location.getLongitude());
double latitude = location.getLatitude();
double longitude = location.getLongitude();
holder.showTourismData(model, latitude,longitude);
holder.setOnClickListener(new CategoryViewHolder.ClickListener() {
@Override
public void onItemClick(View view, int position) {
Intent intent = new Intent(getApplicationContext(), DetailCategoryActivity.class);
intent.putExtra(DetailCategoryActivity.EXTRA_WISATA_KEY, wiskey);
startActivity(intent);
}
});
}
}
});
}
};
firebaseAdapter.notifyDataSetChanged();
rvTourismList.setAdapter(firebaseAdapter);
}
private void verifyPermission() {
if (!hasPermission(this, perms)) {
ActivityCompat.requestPermissions(this, perms, 1);
}
}
private boolean hasPermission(Context context, String[] perms) {
if (context != null && perms != null) {
for (String permission : perms) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_menu, menu);
MenuItem mSearch = menu.findItem(R.id.searchMenu);
SearchView mSearchView = (SearchView) mSearch.getActionView();
mSearchView.setQueryHint("Search");
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String searchText) {
rvTourismList.removeAllViews();
firebaseSearch(searchText);
return super.onCreateOptionsMenu(menu);
}
private void firebaseSearch(String searchText) {
Query firebaseSearchquery = tourismDBRef.child("Tourism").orderByKey().startAt(searchText).endAt(searchText + "\uf8ff");
FirebaseRecyclerOptions<CategoryItem> options = new FirebaseRecyclerOptions.Builder<CategoryItem>()
.setQuery(firebaseSearchquery, CategoryItem.class)
.setLifecycleOwner(this)
.build();
firebaseAdapter = new FirebaseRecyclerAdapter<CategoryItem, CategoryViewHolder>(options) {
@NonNull
@Override
public CategoryViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_category_menu, viewGroup, false);
return new CategoryViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull CategoryViewHolder holder, int position, @NonNull CategoryItem model) {
final DatabaseReference touristRef = getRef(position);
final String wiskey = touristRef.getKey();
holder.showTourismData(model);
holder.setOnClickListener(new CategoryViewHolder.ClickListener() {
@Override
public void onItemClick(View view, int position) {
Intent intent = new Intent(getApplicationContext(), DetailCategoryActivity.class);
intent.putExtra(DetailCategoryActivity.EXTRA_WISATA_KEY, wiskey);
startActivity(intent);
}
});
}
};
rvTourismList.setAdapter(firebaseAdapter);
}
@Override
protected void onStart() {
super.onStart();
firebaseAdapter.startListening();
}
@Override
protected void onStop() {
super.onStop();
if (firebaseAdapter != null) {
firebaseAdapter.stopListening();
}
}
}
Это мои данные структуры базы данных Firebase Realtime
Я ожидаю, что метод слияния местоположения может работатьпотому что мое ожидание показать расстояние, которое является результатом расчета расстояния между текущим местоположением и местом назначения.Спасибо :) 1026 *