我在FirebaselistAdapter
的帮助下将我的firebase数据库中的医院名称填充到列表视图中。现在,我想在列表视图中点击Achimota医院名称时获得密钥Achimota hospital
。
在这里尝试了这个Retrieving the Firebase key from onItemClick in FirebaseListAdapter和几个,但仍然没有得到解决方案。
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数据库
"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"
},
`
我希望在列表视图上单击该项时返回键Achimota hospital
。
任何帮助表示赞赏。