如何按用户位置最多的顺序显示列表(RecyclerView)?

阿多尼斯

如何通过计算每个项目与位置和用户之间的距离,来按最用户所在位置(一个点)的顺序显示列表(RecyclerView)?如您在代码中所见,浏览json时,我会计算距离,但每次用户更改位置时,列表都会使用相同的数据递增

请注意:如果用户的位置发生变化,则必须执行哪些操作来更新列表?

如图所示: 该图说明了我想要实现的目标

这是我的代码:

private List<MarkerObj> markerObjList;

    private void getStation() {

        progressBar.setVisibility(View.VISIBLE);

        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, API_XOIL.STATIONS_LIST, null,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {

                        markerObjList = new ArrayList<>();

                        for (int i=0; i<response.length(); i++) {
                            try {
                                JSONObject jsonObject = response.getJSONObject(i);

                                MarkerObj markerObj = new MarkerObj(
                                        jsonObject.getInt("id"),
                                        jsonObject.getString("libele"),
                                        jsonObject.getString("reference"),
                                        jsonObject.getString("latitude"),
                                        jsonObject.getString("longitude"),
                                        jsonObject.getString("images"),
                                        jsonObject.getString("alimentation"),
                                        jsonObject.getString("wifi"),
                                        jsonObject.getString("fastfood"),
                                        jsonObject.getString("lavage"),
                                        jsonObject.getString("entretien"));

                                /*markerObjList.add(markerObj);
                                NosStations.AdapterListeStations adapterListeStations = new NosStations.AdapterListeStations(getApplicationContext(), markerObjList);
                                recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
                                recyclerView.setAdapter(adapterListeStations);
                                recyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(), LinearLayoutManager.VERTICAL));
                                recyclerView.setHasFixedSize(true);
                                adapterListeStations.notifyDataSetChanged();*/

                                LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                                int finalI = i;
                                LocationListener locationListener = new LocationListener() {
                                    @Override
                                    public void onLocationChanged(Location location) {

                                        double latView = location.getLatitude();
                                        double lonView = location.getLongitude();

                                        try {
                                            
                                            Location loc1 = new Location(markerObj.getName());
                                            loc1.setLatitude(Double.parseDouble(markerObj.getLat()));
                                            loc1.setLongitude(Double.parseDouble(markerObj.getLon()));

                                            Location loc2 = new Location("");
                                            loc2.setLatitude(latView);
                                            loc2.setLongitude(lonView);

                                            float distanceInMeters = loc1.distanceTo(loc2);
                                            String distanceView = String.valueOf(distanceInMeters);

                                            MarkerObj markerObj1 = new MarkerObj(
                                                    markerObj.getId(),
                                                    markerObj.getName(),
                                                    markerObj.getRef(),
                                                    markerObj.getLat(),
                                                    markerObj.getLon(),
                                                    markerObj.getImages(),
                                                    markerObj.getAlimentation(),
                                                    markerObj.getWifi(),
                                                    markerObj.getFastfood(),
                                                    markerObj.getLavage(),
                                                    markerObj.getEntretien(),
                                                    distanceView);

                                            markerObjList.add(markerObj1);
                                            NosStations.AdapterListeStations adapterListeStations = new NosStations.AdapterListeStations(getApplicationContext(), markerObjList);
                                            recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
                                            recyclerView.setAdapter(adapterListeStations);
                                            recyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(), LinearLayoutManager.VERTICAL));
                                            recyclerView.setHasFixedSize(true);
                                            adapterListeStations.notifyDataSetChanged();

                                            progressBar.setVisibility(View.GONE);

                                        }
                                        catch (Exception e){
                                            e.printStackTrace();
                                            Log.e("error", e.toString());
                                        }
                                    }

                                    @Override
                                    public void onStatusChanged(String provider, int status, Bundle extras) {
                                    }

                                    @Override
                                    public void onProviderEnabled(String provider) {

                                    }

                                    @Override
                                    public void onProviderDisabled(String provider) {

                                    }
                                };

                                if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION)
                                        != PackageManager.PERMISSION_GRANTED &&
                                        ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION)
                                                != PackageManager.PERMISSION_GRANTED) {
                                    return;
                                }
                                assert locationManager != null;
                                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 0, locationListener);
                                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 30000, 0, locationListener);
                                locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
                                locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);


                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        if (error instanceof NetworkError) {
                            progressBar.setVisibility(View.GONE);
                            getOfflineMarker();
                            Toast.makeText(getApplicationContext(), getString(R.string.volley_network_error), Toast.LENGTH_LONG).show();
                        }
                        else if (error instanceof ServerError) {
                            progressBar.setVisibility(View.GONE);
                            getOfflineMarker();
                            Toast.makeText(getApplicationContext(), getString(R.string.volley_server_error), Toast.LENGTH_LONG).show();
                        }
                        else if (error instanceof AuthFailureError) {
                            progressBar.setVisibility(View.GONE);
                            getOfflineMarker();
                            Toast.makeText(getApplicationContext(), getString(R.string.volley_authfail), Toast.LENGTH_LONG).show();
                        }
                        else if (error instanceof ParseError) {
                            progressBar.setVisibility(View.GONE);
                            getOfflineMarker();
                            Toast.makeText(getApplicationContext(), getString(R.string.volley_parse_error), Toast.LENGTH_LONG).show();
                        }
                        else if (error instanceof TimeoutError) {
                            progressBar.setVisibility(View.GONE);
                            getOfflineMarker();
                            Toast.makeText(getApplicationContext(), getString(R.string.volley_time_out_error), Toast.LENGTH_LONG).show();
                        }
                    }
                });

        VolleySingleton.getInstance(getApplicationContext()).addToRequestQueue(jsonArrayRequest);
    }

米林颜色

您需要分开markerObjList和位置更改侦听器的填充。在“ onResponse”方法中,仅填充markerObject列表。

在单独的方法(例如onCreate of view)中创建位置更改侦听器,并在触发位置侦听器时,重新计算所有标记对象的距离,根据更新的距离对列表进行排序,并将排序后的列表设置为适配器。该代码看起来像这样

onCreate()
   {
       LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
       int finalI = i;
       LocationListener locationListener = new LocationListener() {
           @Override
           public void onLocationChanged(Location location) {

               double latView = location.getLatitude();
               double lonView = location.getLongitude();

               try {
               
                   ArrayList<> newMarkerObjList = new ArrayList<>();
                   int i = 0;
                   // recalcualte distances of all marker and add them in new list
                   for( i =0; i < markerObjList.size()){
                   
                       MarkerObj   markerObj = markerObjList[i]
                       Location loc1 = new Location(markerObj.getName());
                       loc1.setLatitude(Double.parseDouble(markerObj.getLat()));
                       loc1.setLongitude(Double.parseDouble(markerObj.getLon()));

                       Location loc2 = new Location("");
                       loc2.setLatitude(latView);
                       loc2.setLongitude(lonView);

                       float distanceInMeters = loc1.distanceTo(loc2);
                       String distanceView = String.valueOf(distanceInMeters);

                       MarkerObj markerObj1 = new MarkerObj(
                               markerObj.getId(),
                               markerObj.getName(),
                               markerObj.getRef(),
                               markerObj.getLat(),
                               markerObj.getLon(),
                               markerObj.getImages(),
                               markerObj.getAlimentation(),
                               markerObj.getWifi(),
                               markerObj.getFastfood(),
                               markerObj.getLavage(),
                               markerObj.getEntretien(),
                               distanceInMeters,
                               distanceView);

                       newMarkerObjList.add(markerObj1);
                   }
                   // create a predicate for sorting based on 'distanceInMeters';
                   Collections.sort( newMarkerObjList); 
                   markerObjList = newMarkerObjList;
                   // and set this new list to the adapter;
                   NosStations.AdapterListeStations adapterListeStations = new NosStations.AdapterListeStations(getApplicationContext(), markerObjList);
                   recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
                   recyclerView.setAdapter(adapterListeStations);
                   recyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(), LinearLayoutManager.VERTICAL));
                   recyclerView.setHasFixedSize(true);
                   adapterListeStations.notifyDataSetChanged();

                   progressBar.setVisibility(View.GONE);

               }
               catch (Exception e){
                   e.printStackTrace();
                   Log.e("error", e.toString());
               }
           }

           @Override
           public void onStatusChanged(String provider, int status, Bundle extras) {
           }

           @Override
           public void onProviderEnabled(String provider) {

           }

           @Override
           public void onProviderDisabled(String provider) {

           }
       };
   }

为数组中的每个元素添加当前位置侦听器,并在同一列表中添加更新的标记对象,因此导致列表中标记重复,并增加了标记列表的大小

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何按重复项最多的顺序对重复项列表进行排序-Python

来自分类Dev

对象列表查看如何按显示顺序复制值

来自分类Dev

如何在cshtml中按用户位置显示时间戳

来自分类Dev

SQL:如何显示项目最多的用户名的前十名列表?

来自分类Dev

SQL:如何显示项目最多的用户名的前十名列表?

来自分类Dev

流星:如何按最多关注者对用户进行排序?

来自分类Dev

列表项的位置错误,即使列表按字母顺序排序

来自分类Dev

如何停止Bootstrap-3-Typeahead下拉列表按顺序显示元素

来自分类Dev

Lotus Domino Designer-对话框列表公式-如何按字母顺序显示选择?

来自分类Dev

如何遍历按顺序命名的文件列表?

来自分类Dev

如何按以下顺序显示月份名称

来自分类Dev

Javascript:如何按顺序显示图片?

来自分类Dev

按显示顺序获取工具栏列表选项

来自分类Dev

如何按字典顺序对列表列表进行排序?

来自分类Dev

如何按字母顺序排列列表中的列表?

来自分类Dev

如何输出按用户排序的命令列表?

来自分类Dev

按字母顺序显示

来自分类Dev

用户如何按搜索栏上的顺序选择?滑轨

来自分类Dev

如何按字母顺序对 Github 用户 API 进行排序

来自分类Dev

在Coldfusion中,如何按字母顺序然后按数字顺序排列列表

来自分类Dev

如何仅显示位置列表中的错误?

来自分类Dev

在R中:如何按顺序在列表中存储编号

来自分类Dev

如何按字母顺序对模板中的对象列表进行排序?

来自分类Dev

如何在Android TextView中使用按顺序获取列表

来自分类Dev

如何按字母顺序对列表视图进行排序

来自分类Dev

如何按字母顺序对字母数字列表进行排序

来自分类Dev

C#-如何按彩虹顺序排列颜色列表?

来自分类Dev

如何按字母顺序排列对象列表?

来自分类Dev

如何按字母顺序复制和合并多个.txt列表?

Related 相关文章

  1. 1

    如何按重复项最多的顺序对重复项列表进行排序-Python

  2. 2

    对象列表查看如何按显示顺序复制值

  3. 3

    如何在cshtml中按用户位置显示时间戳

  4. 4

    SQL:如何显示项目最多的用户名的前十名列表?

  5. 5

    SQL:如何显示项目最多的用户名的前十名列表?

  6. 6

    流星:如何按最多关注者对用户进行排序?

  7. 7

    列表项的位置错误,即使列表按字母顺序排序

  8. 8

    如何停止Bootstrap-3-Typeahead下拉列表按顺序显示元素

  9. 9

    Lotus Domino Designer-对话框列表公式-如何按字母顺序显示选择?

  10. 10

    如何遍历按顺序命名的文件列表?

  11. 11

    如何按以下顺序显示月份名称

  12. 12

    Javascript:如何按顺序显示图片?

  13. 13

    按显示顺序获取工具栏列表选项

  14. 14

    如何按字典顺序对列表列表进行排序?

  15. 15

    如何按字母顺序排列列表中的列表?

  16. 16

    如何输出按用户排序的命令列表?

  17. 17

    按字母顺序显示

  18. 18

    用户如何按搜索栏上的顺序选择?滑轨

  19. 19

    如何按字母顺序对 Github 用户 API 进行排序

  20. 20

    在Coldfusion中,如何按字母顺序然后按数字顺序排列列表

  21. 21

    如何仅显示位置列表中的错误?

  22. 22

    在R中:如何按顺序在列表中存储编号

  23. 23

    如何按字母顺序对模板中的对象列表进行排序?

  24. 24

    如何在Android TextView中使用按顺序获取列表

  25. 25

    如何按字母顺序对列表视图进行排序

  26. 26

    如何按字母顺序对字母数字列表进行排序

  27. 27

    C#-如何按彩虹顺序排列颜色列表?

  28. 28

    如何按字母顺序排列对象列表?

  29. 29

    如何按字母顺序复制和合并多个.txt列表?

热门标签

归档