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