Android 在循环内对Recycleview适配器进行排序

Android 在循环内对Recycleview适配器进行排序,android,android-recyclerview,android-adapter,Android,Android Recyclerview,Android Adapter,我正在制作一个聊天应用程序,显示我和每个用户之间的距离 情况如下: public class MapPersonAdapter extends RecyclerView.Adapter<MapPersonAdapter.MyViewHolder> { private View mView; private List<MapPerson> personsList; private FirebaseAuth auth; StorageRef

我正在制作一个聊天应用程序,显示我和每个用户之间的距离

情况如下:

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();
    }

}
有没有一种方法可以对该列表进行排序,使其显示最接近的第一个和最远的最后一个?现在,它根据添加到适配器的顺序进行添加

我的适配器代码如下所示:

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();
    }

}
在调用MapPersonadAdapter.notifyDataSetChanged;,之前;,使用NOTIFYDATASETCHENGED,根据距离对personList进行排序,然后调用NOTIFYDATASETCHENGED


我得到的排序是API>24。有针对低API的解决方案吗?使用21 atm。api对最终解决方案来说并不重要。您必须在加载列表之前进行排序。“以后不能再做了。@Ben忽略使用java 8的最后一部分。使用解决方案的第一部分我已根据需要添加了代码段。你也应该节省双倍的距离,并用它来比较两个人。非常感谢你,伙计!我刚刚添加了end Collection.reversepersonList以显示最接近的first=]
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());
    }
});