Как можно использовать Collections.sort() во фрагменте и adpater?

#android #android-recyclerview #collections #adapter

Вопрос:

Как можно отсортировать расстояние от близкого до дальнего?

Я рассчитаю, как далеко пользователь находится от каждой точки.

это мой код

 if(seatch_bar.getText().toString().equals("")){
                    camperSiteModel.clear();
                    for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                        CamperSiteModel camperSiteModel1 = snapshot.getValue(CamperSiteModel.class);

                        double radLat1 = rad(camperSiteModel1.getCamperSiteLatitude());
                        double radLat2 = rad(latitude);
                        double a = radLat1 - radLat2;
                        double b = rad(camperSiteModel1.getCamperSiteLongitude()) - rad(longitude);
                        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
                                  Math.cos(radLat1) * Math.cos(radLat2)
                                * Math.pow(Math.sin(b / 2), 2)));
                        s = s * EARTH_RADIUS;
                        s = Math.round(s * 10000) / 10000;  
                        Log.i("Distance",Math.ceil(s) "");

                        camperSiteModel1.setDistance(Math.ceil(s));
                        camperSiteModel.add(camperSiteModel1);
                        Collections.sort(camperSiteModel,new Comparator<CamperSiteModel>() {
                            @Override
                            public int compare(CamperSiteModel o1, CamperSiteModel o2) {
                                return o1.getCamperSiteName().compareTo(o2.getCamperSiteName());
                            }
                        });

                    }
                    camperSiteAdapter.notifyDataSetChanged();
                }
 

Я использую этот код, но он не сортирует данные.

Ответ №1:

ну, в случае пользовательских классов вы должны предоставить свой способ их сравнения, подключившись к Collections.sort(camperSiteModel);, компаратору для сравнения между вашими двумя объектами, чтобы быть похожим на это

  Collections.sort(camperSiteModel, new Comparator<CamperSiteModel >() {
            @Override
            public int compare(CamperSiteModel o1, CamperSiteModel o2) {
                // here you should do the comparison between data of your two objects to return an int that indicates if `o1<o2` or `o1>o2` or `o1==o2
                 return o1.getDist()-o2.getDist(); //incase of int/long
                 //return o1.getStr().equals(o2.getStr()) // incase of strings
                 //you should see how to compare between your data the right way where in case your data is a generic type like Integer/Long instead of int/long you would find the `o1.getData().equals(o2.getData())` to be very useful. 
            }
        });
 

вам следует попробовать поиск Comparator Java и как его использовать в Google, чтобы узнать больше.

Комментарии:

1. getDist — это (лат., lng) ?

2. это все, что вы хотите, это просто пример метода, который я написал, который вернет значение int/long, которое вы вычитаете, чтобы вернуть значение, указывающее на сравнение между двумя объектами, вы можете делать все, что хотите, внутри метода сравнения, но вы должны возвращать положительное значение int, если o1>o2, отрицательное, если o1>