从FirebaseListAdapter中的onItemClick获取Firebase项目键

时间:2017-06-24 16:03:12

标签: android listview firebase firebase-realtime-database firebaseui

我在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。 任何帮助表示赞赏。

0 个答案:

没有答案