如何在RecyclerView中对项目排序?

时间:2019-04-16 04:30:55

标签: java android android-recyclerview

我想对recyclerView中的项目进行排序。我有用户名,例如20ABC1、20ABC2,...,20ABC10等。

我已经尝试从相关问题中回答,其中之一是:

public static final Comparator<Users> BY_NAME_ALPHABETICAL = (users, t1) -> users.Username.compareTo(t1.Username);

但这不能完全解决问题。 20ABC10、20ABC11,... 20ABC19高于20ABC2。我认为是因为它逐个字符地检查。

有什么办法可以解决这个问题?

谢谢:)

4 个答案:

答案 0 :(得分:1)

通过使用Bohemian的答案Sorting Strings that contains number in Java解决了我的问题,他从字符串中删除了字母,然后比较了其余的ints

Collections.sort(strings, new Comparator<String>() {
    public int compare(String o1, String o2) {
        return extractInt(o1) - extractInt(o2);
    }

    int extractInt(String s) {
        String num = s.replaceAll("\\D", "");
        // return 0 if no digits found
        return num.isEmpty() ? 0 : Integer.parseInt(num);
    }
});

答案 1 :(得分:1)

public Observable<User> getUsersWithBlogs() {
return Observable.fromIterable(UserCache.getAllUsers())
.filter(user -> user.blog != null && !user.blog.isEmpty())
.sorted((user1, user2) -> user1.name.compareTo(user2.name));
}

答案 2 :(得分:0)

将其放入适配器

void sortByName(boolean isDescending) {
    if (mDataList.size() > 0) {
        Collections.sort(mDataList, new Comparator<Users>() {
            @Override
            public int compare(Users object1, Users object2) {
                if (isDescending)
                    return object2.getUsername().toLowerCase().compareTo(object1.getUsername().toLowerCase().trim());
                else
                    return object1.getUsername().toLowerCase().compareTo(object2.getUsername().toLowerCase().trim());
            }
        });
        notifyDataSetChanged();
    }
}

然后像这样使用它:

adapter.sortByName( true||false );

答案 3 :(得分:0)

使用kotlin,

val comp: Comparator<Users> = Comparator { o1, o2 -> o1.Username.trim().compareTo(o2.Username.trim()) }
Collections.sort(users, comp)

对Java执行相同的操作。