列表靠近数据库Android的地方

i have a table with list of places am using php with (constant coordinates as the users location) to get the nearest place to the user in json and passing it to android recycler view. What am asking is if its possible to get the users location from android and get the nearest place from the db thanks for your help

Getting the nearest place

    <?php
require("dbdetails.php");
// Get parameters from URL


$center_lat = "0.2941146";
$center_lng = "32.5580577";
$radius = "25";

// Opens a connection to a mySQL server
$connection = mysql_connect ('localhost', $username, $password);
if (!$connection) {
  die("Not connected : " . mysql_error());
}
// Set the active mySQL database
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected) {
  die ("Can\'t use db : " . mysql_error());
}
// Search the rows in the markers table
$query = sprintf("SELECT
  id,name,phone, (
    3959 * acos (
      cos ( radians(0.2941146) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(32.5580577) )
      + sin ( radians(0.2941146) )
      * sin( radians( lat ) )
    )
  ) AS distance
FROM markers
HAVING distance < 30
ORDER BY distance
LIMIT 0 , 20;");


$result = mysql_query($query);

if (!$result) {
  die("Invalid query: " . mysql_error());
}

$dbdata =  array();
// Iterate through the rows, adding XML nodes for each
while ($row = @mysql_fetch_assoc($result)){

$dbdata[]=$row;

}
//Print array in JSON format
$locs = json_encode($dbdata);

 file_put_contents('nearestlocations.json', $locs);
?>

Near by places Adapter to pass the result into android

public class NearestLocationAdapter extends RecyclerView.Adapter<NearestLocationAdapter.ViewHolder> {

    private Context context;
    private List<NearestLocation> listofnearestlocations;


    public NearestLocationAdapter(Context context, List<NearestLocation> listofnearestlocations) {
        this.context = context;
        this.listofnearestlocations = listofnearestlocations;
    }

    @NonNull
    @Override
    public NearestLocationAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(context).inflate(R.layout.single_item, viewGroup, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull NearestLocationAdapter.ViewHolder viewHolder, int i) {

        NearestLocation nerbylocation = listofnearestlocations.get(i);
        viewHolder.textHospital.setText(nerbylocation.getName());
        viewHolder.textNumber.setText(nerbylocation.getPhone());
        viewHolder.textDistance.setText(nerbylocation.getDistance());

    }

    @Override
    public int getItemCount() {
        return listofnearestlocations.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView textHospital, textNumber, textDistance;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            textHospital = itemView.findViewById(R.id.locationname);
            textNumber = itemView.findViewById(R.id.locationphone);
            textDistance = itemView.findViewById(R.id.locationdistance);
        }
    }
}

Adding the result to android

  public class NearestLocationActivity extends AppCompatActivity {
    private String url = "http://192.168.43.163/prep/nearestlocations.json";

    private RecyclerView mList;

    private LinearLayoutManager linearLayoutManager;
    private DividerItemDecoration dividerItemDecoration;
    private List<NearestLocation> nearList;
    private RecyclerView.Adapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_nearest_location);

        mList = findViewById(R.id.main_list);

        nearList = new ArrayList<>();
        adapter = new NearestLocationAdapter(getApplicationContext(),nearList);

        linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        dividerItemDecoration = new DividerItemDecoration(mList.getContext(), linearLayoutManager.getOrientation());

        mList.setHasFixedSize(true);
        mList.setLayoutManager(linearLayoutManager);
        mList.addItemDecoration(dividerItemDecoration);
        mList.setAdapter(adapter);

        getData();
    }

    private void getData() {
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Loading...");
        progressDialog.show();

        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                for (int i = 0; i < response.length(); i++) {
                    try {
                        JSONObject jsonObject = response.getJSONObject(i);

                        NearestLocation nearestLocation = new NearestLocation();
                        nearestLocation.setName(jsonObject.getString("name"));
                        nearestLocation.setPhone(jsonObject.getInt("phone"));
                        nearestLocation.setDistance(jsonObject.getInt("distance"));

                        nearList.add(nearestLocation);
                    } catch (JSONException e) {
                        e.printStackTrace();
                        progressDialog.dismiss();
                    }
                }
                adapter.notifyDataSetChanged();
                progressDialog.dismiss();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("Volley", error.toString());
                progressDialog.dismiss();
            }
        });
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(jsonArrayRequest);
    }
}
查看全部
doutui2016
doutui2016
2019/02/15 11:32
  • android
  • php
  • mysql
  • 点赞
  • 收藏
  • 回答
    私信
满意答案
查看全部

2个回复