Адаптер сортировки Recycleview внутри цикла - PullRequest
0 голосов
/ 18 октября 2019

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

Это выглядит следующим образом:

enter image description here

Есть ли способ отсортировать этот список таким образом, чтобы он показывал самый близкий первый и самый дальний последний? теперь он добавляет в соответствии с порядком, который он добавляет к адаптеру.

Мой код адаптера выглядит следующим образом:

public class MapPersonAdapter extends RecyclerView.Adapter<MapPersonAdapter.MyViewHolder> {

    private View mView;
    private List<MapPerson> personsList;
    private FirebaseAuth auth;

    StorageReference storageRef;


    public class MyViewHolder extends RecyclerView.ViewHolder{
        public TextView personName, personDistance;
        public ImageView personProfile;
        public ImageButton personChat;

        public MyViewHolder(View view){
            super(view);
            personName = (TextView) view.findViewById( R.id.tvPersonName );
            personDistance = (TextView) view.findViewById( R.id.tvDistance );
            personProfile = (ImageView) view.findViewById( R.id.ivPersonPic );
            personChat = (ImageButton) view.findViewById( R.id.imageChat );
            mView = view;
        }
    }

    public MapPersonAdapter(List<MapPerson> personsList){
        this.personsList = personsList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
        View itemView = LayoutInflater.from( parent.getContext() ).inflate( R.layout.activity_map_person,parent,false);
        return new MyViewHolder( itemView );
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        MapPerson mapPerson = personsList.get( position );
        String ID = mapPerson.getPersonID();

        FirebaseFirestore db = FirebaseFirestore.getInstance();
        CollectionReference username = db.collection( "Users" ).document( ID ).collection( "UserData" );
        username.get().addOnCompleteListener( new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        holder.personName.setText( document.getString( "username" ) );
                    }
                } else {
                    Log.d( "Error", "Error getting documents: ", task.getException() );
                }
            }
        } );

        holder.personDistance.setText( mapPerson.getPersonDistance() + " km" );


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

}

Что я спрашиваю, могу ли я каким-либо образом сортировать, основываясь на значенииmapPerson.getPersonDistance().

Этот адаптер вызывается внутри цикла:

for (String PersonID : PeopleAround) {

    DocumentReference docRef = db.collection( "Users" ).document(PersonID).collection( "Location" ).document(PersonID);
    docRef.get().addOnCompleteListener( new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {

                DocumentSnapshot doc2 = task.getResult();

                float distance = CalculateDistance(Lat, Lon);
                if (!PersonID.equals( auth.getUid() )) {
                    if (distance <= Radius) {
                        MapPerson mapPerson = new MapPerson( PersonID, new DecimalFormat( "##.##" ).format( distance ) );
                        personList.add( mapPerson );
                        mapPersonAdapter.notifyDataSetChanged();
                    }
                }
            }
        }
    } );
}

1 Ответ

1 голос
/ 18 октября 2019

Перед вызовом mapPersonAdapter.notifyDataSetChanged(); отсортируйте personList по расстоянию, используя Comparator , а затем позвоните notifyDataSetChanged()

Collections.sort(personsList, new Comparator< MapPerson >() {

    public int compare(MapPerson o1, MapPerson o2) {
        // compare two instance of `Score` and return `int` as result.
        return o2.getDistance().compareTo(o1.getDistance());
    }
});
...