I am populating name of hospitals from my firebase database into a listview with the help of FirebaselistAdapter
. Now i want to get the key say Achimota hospital
when Achimota hospital name is clicked from the listview.
Have tried this Retrieving the Firebase key from onItemClick in FirebaseListAdapter and several ones here but still not gotten a solution.
Hospital_main.java
`
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.IntentSender;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.firebase.ui.database.FirebaseListAdapter;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStatusCodes;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Hospital_main extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback<LocationSettingsResult> {
protected GoogleApiClient mGoogleApiClient;
protected LocationRequest locationRequest;
int REQUEST_CHECK_SETTINGS = 100;
TextView currentLocation;
// GPSTracker class
GPSTracker gps;
public ListView mlistView;
private ProgressDialog mProgressDialog;
private DatabaseReference myRef;
public double currentLat,currentLon;
public TextView distanceLength;
public double distance;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hospital_main);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mlistView = (ListView) findViewById(R.id.listViewHospital);
//distanceLength = (TextView) findViewById(R.id.currentLocation3) ;
gps = new GPSTracker(Hospital_main.this);
if (gps.canGetLocation()){
double latitude = gps.getLatitude();
double longitude = gps.getLongitude();
currentLat = latitude;
currentLon = longitude;
BackgroundOperation bg = new BackgroundOperation();
bg.execute();
}else {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).build();
mGoogleApiClient.connect();
locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(30 * 1000);
locationRequest.setFastestInterval(5 * 1000);
}
}
class BackgroundOperation extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog = new ProgressDialog(Hospital_main.this);
mProgressDialog.setMessage("Loading...");
mProgressDialog.setCancelable(false);
mProgressDialog.show();
}
@Override
protected String doInBackground(String... params) {
FirebaseDatabase database = FirebaseDatabase.getInstance();
myRef = database.getReference("Hospitals");
return null;
}
@Override
protected void onPostExecute(String result) {
final FirebaseListAdapter<FacilityDetails> firebaseListAdapter = new FirebaseListAdapter<FacilityDetails>(
Hospital_main.this,
FacilityDetails.class,
R.layout.list_row,
myRef
) {
@Override
protected void populateView(View v, FacilityDetails model, int position) {
TextView textView = (TextView) v.findViewById(R.id.title);
TextView textView1 = (TextView) v.findViewById(R.id.subtitle);
String d = null;
if (model.name.length() < 24){
d = " ";
}else {
d = "..";
}
textView.setText(model.name.substring(0,Math.min(model.name.length(),24))+d);
textView1.setText(model.description.substring(0,Math.min(model.description.length(),120))+" ...");
TextView textView2 = (TextView) v.findViewById(R.id.duration);
/** Callculating the location **/
Location mylocation = new Location("");
Location dest_location = new Location("");
String lat = Double.toString(model.latitude);
String lon = Double.toString(model.longitude);
dest_location.setLatitude(Double.parseDouble(lat));
dest_location.setLongitude(Double.parseDouble(lon));
Double my_locLat = currentLat;
Double my_locLng = currentLon;
mylocation.setLatitude(my_locLat);
mylocation.setLongitude(my_locLng);
distance = round((mylocation.distanceTo(dest_location))/1000,2);//in meters
String calDistance = Double.toString(distance)+"Km";
textView2.setText(calDistance);
if ( mProgressDialog!=null && mProgressDialog.isShowing() ){
mProgressDialog.dismiss();
}
}
};
mlistView.setAdapter(firebaseListAdapter);
if (mlistView.isEnabled()){
mlistView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
DatabaseReference itemRef = firebaseListAdapter.getRef(position);
String Topic = itemRef.getKey();
Toast toast = Toast.makeText(getApplicationContext(), "Topic: "+Topic, Toast.LENGTH_SHORT);
toast.show();
}
});
}
}
@Override
protected void onProgressUpdate(Void... values) {
if ( mProgressDialog!=null && mProgressDialog.isShowing() ){
mProgressDialog.dismiss();
}
}
}
@Override
public void onConnected(@Nullable Bundle bundle) {
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
builder.setAlwaysShow(true);
PendingResult<LocationSettingsResult> result =
LocationServices.SettingsApi.checkLocationSettings(
mGoogleApiClient,
builder.build()
);
result.setResultCallback(this);
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
final Status status = locationSettingsResult.getStatus();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
// NO need to show the dialog;
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. Show the user a dialog
try {
// Show the dialog by calling startResolutionForResult(), and check the result
// in onActivityResult().
status.startResolutionForResult(Hospital_main.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException e) {
//failed to show
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings are unavailable so not possible to show any dialog now
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CHECK_SETTINGS) {
if (resultCode == RESULT_OK) {
Toast.makeText(getApplicationContext(), "GPS enabled", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), "GPS is not enabled", Toast.LENGTH_LONG).show();
}
}
}
public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.doubleValue();
}
}
FacilityDetails.java
public class FacilityDetails {
public String name;
public String description;
public double latitude;
public double longitude;
}
Firebase Database
"Achimota hospital" : {
"contact" : "0302-400553",
"description" : "Achimota Hospital in Achimota, Accra provides services in Health & Medical Centers and Hospitals. ",
"distance" : 2.74,
"insurance" : "NHIS",
"latitude" : 5.6294907,
"location" : "5.6294907,-0.2192158",
"longitude" : -0.2192158,
"name" : "Achimota Hospital",
"service" : "General"
},
"Dangbe West District Hospital" : {
"contact" : "0244-274807",
"description" : "The Dangme East District hospital is one of the ten (10) district hospitals in the Greater Accra Region of Ghana. It covers Big Ada and Ada Kasseh. Ada Foah.",
"distance" : 1,
"insurance" : "NHIS",
"latitude" : 5.87958,
"location" : "5.879580,-0.094806",
"longitude" : -0.094806,
"name" : "Dangbe West District Hospital",
"service" : "General"
},
`
I want to return the key Achimota hospital
when that item is clicked on the listview.
Any help appreciated.