Java 如何按最低数量/字符串对recyclerview进行排序Android Studio

Java 如何按最低数量/字符串对recyclerview进行排序Android Studio,java,android,sorting,android-recyclerview,Java,Android,Sorting,Android Recyclerview,我的应用程序中有一个recyclerview,它包含两个文本视图,一个是rankTextView,另一个是nameTextview。像这样的东西 rankTextview = (TextView) itemView.findViewById(R.id.ranktextview); nameTextview = (TextView) itemView.findViewById(R.id.nametextview); public addPerson(String rankTextview,

我的应用程序中有一个recyclerview,它包含两个文本视图,一个是rankTextView,另一个是nameTextview。像这样的东西

 rankTextview = (TextView) itemView.findViewById(R.id.ranktextview);
 nameTextview = (TextView) itemView.findViewById(R.id.nametextview);
 public addPerson(String rankTextview, String personTextview,) {
        this.rankTextview = rankTextview;
        this.personTextview = personTextview;
    }
person.add(new addPerson
        ("1\nrank", "James Kub"));
person.add(new addPerson
        ("2\nrank", "Peter Hanly"));
person.add(new addPerson
        ("3\nrank", "Josh Penny"));
person.add(new addPerson
        ("1\nrank", "Danny Jackson"));
person.add(new addPerson
        ("3\nrank", "Brad Black"));

我要做的是对这个recyclerview进行排序,首先是以最低的数字顺序,如果有两个相同的数字,那么我希望它按字符串排序。例如,在上面的截图中,两个人排名1,首先我希望recyclerview将这些放在首位,然后按字符串进行排序

我在网上搜索了一下,想知道我该怎么做,但由于我是android新手,所以我无法将这些发现应用到我的项目中。比如,

我创建了一个自定义适配器,它包含一个名为rankTextview的textview和另一个名为nameTextview的textview,如下所示

 rankTextview = (TextView) itemView.findViewById(R.id.ranktextview);
 nameTextview = (TextView) itemView.findViewById(R.id.nametextview);
 public addPerson(String rankTextview, String personTextview,) {
        this.rankTextview = rankTextview;
        this.personTextview = personTextview;
    }
person.add(new addPerson
        ("1\nrank", "James Kub"));
person.add(new addPerson
        ("2\nrank", "Peter Hanly"));
person.add(new addPerson
        ("3\nrank", "Josh Penny"));
person.add(new addPerson
        ("1\nrank", "Danny Jackson"));
person.add(new addPerson
        ("3\nrank", "Brad Black"));
然后,我有一个方法,它将这些文本视图中的值作为参数,如下所示

 rankTextview = (TextView) itemView.findViewById(R.id.ranktextview);
 nameTextview = (TextView) itemView.findViewById(R.id.nametextview);
 public addPerson(String rankTextview, String personTextview,) {
        this.rankTextview = rankTextview;
        this.personTextview = personTextview;
    }
person.add(new addPerson
        ("1\nrank", "James Kub"));
person.add(new addPerson
        ("2\nrank", "Peter Hanly"));
person.add(new addPerson
        ("3\nrank", "Josh Penny"));
person.add(new addPerson
        ("1\nrank", "Danny Jackson"));
person.add(new addPerson
        ("3\nrank", "Brad Black"));
然后我在我的主类中调用这个方法来添加数据,如下所示

 rankTextview = (TextView) itemView.findViewById(R.id.ranktextview);
 nameTextview = (TextView) itemView.findViewById(R.id.nametextview);
 public addPerson(String rankTextview, String personTextview,) {
        this.rankTextview = rankTextview;
        this.personTextview = personTextview;
    }
person.add(new addPerson
        ("1\nrank", "James Kub"));
person.add(new addPerson
        ("2\nrank", "Peter Hanly"));
person.add(new addPerson
        ("3\nrank", "Josh Penny"));
person.add(new addPerson
        ("1\nrank", "Danny Jackson"));
person.add(new addPerson
        ("3\nrank", "Brad Black"));
现在我要做的是首先按照最低的数字顺序排序这些数据,例如1,2,3。。。如果有两个相同的数字,我想按名字的字母顺序排序。此外,在未来我的应用程序将包含点,而不是像这样的十进制数字排名。1.1、1.5、1.1、2.1、2.5等等,所以在按等级排序时,可以计算十进制数

另外,由于我有这么多行代码,我不确定应该提供哪些部分,哪些不提供,请告诉我是否有我遗漏的代码,我应该包括在内

编辑:

public void animateTo(List<ExampleModel> models) {
        applyAndAnimateRemovals(models);
        applyAndAnimateAdditions(models);
        applyAndAnimateMovedItems(models);
    }

    private void applyAndAnimateRemovals(List<ExampleModel> newModels) {
        for (int i = mModels.size() - 1; i >= 0; i--) {
            final ExampleModel model = mModels.get(i);
            if (!newModels.contains(model)) {
                removeItem(i);
            }
        }
    }

    private void applyAndAnimateAdditions(List<ExampleModel> newModels) {
        for (int i = 0, count = newModels.size(); i < count; i++) {
            final ExampleModel model = newModels.get(i);
            if (!mModels.contains(model)) { // error here, saying cannot resolve method contains
                addItem(i, model);
            }
        }
    }

    private void applyAndAnimateMovedItems(List<ExampleModel> newModels) {
        for (int toPosition = newModels.size() - 1; toPosition >= 0; toPosition--) {
            final ExampleModel model = newModels.get(toPosition);
            final int fromPosition = mModels.indexOf(model);
            if (fromPosition >= 0 && fromPosition != toPosition) {
                moveItem(fromPosition, toPosition);
            }
        }
    }

    public ExampleModel removeItem(int position) {
        final ExampleModel model = mModels.remove(position); // Error here, saying in sortedlist cannot be applied to (int)
        notifyItemRemoved(position);
        return model;
    }

    public void addItem(int position, ExampleModel model) {
        mModels.add(position, model); // Error here, saying add has private access in 'android.support.v7.util.SortedList'
        notifyItemInserted(position);
    }

    public void moveItem(int fromPosition, int toPosition) {
        final ExampleModel model = mModels.remove(fromPosition); // Error here, saying in sortedlist cannot be applied to (int)
        mModels.add(toPosition, model); // Error here, saying add has private access in 'android.support.v7.util.SortedList'
        notifyItemMoved(fromPosition, toPosition);
    }
public void animateTo(列出模型){
应用数据删除(模型);
应用程序添加(模型);
应用数据移动数据项(模型);
}
私有无效应用程序数据删除(列出新模型){
对于(int i=mModels.size()-1;i>=0;i--){
最终示例模型=mModels.get(i);
如果(!newModels.contains(model)){
删除项目(i);
}
}
}
私有无效应用程序添加(列出新模型){
for(int i=0,count=newModels.size();i=0;toPosition--){
final ExampleModel model=newModels.get(拓扑位置);
最终int fromPosition=mModels.indexOf(模型);
if(fromPosition>=0&&fromPosition!=TopoPosition){
移动项目(从位置、位置);
}
}
}
public ExampleModel removeItem(内部位置){
final ExampleModel model=mModels.remove(position);//此处有错误,表示在sortedlist中不能应用于(int)
已移除(位置)的项目;
收益模型;
}
公共void附加项(int位置,示例模型){
mModels.add(position,model);//此处出错,称add在“android.support.v7.util.SortedList”中具有私有访问权限
(位置);
}
公共无效移动项(int-fromPosition、int-toPosition){
final ExampleModel model=mModels.remove(fromPosition);//此处出现错误,表示在sortedlist中不能应用于(int)
mModels.add(toPosition,model);//此处出错,称add在“android.support.v7.util.SortedList”中具有私有访问权限
已移动的项目(从位置、位置);
}
排序取决于返回的比较结果。您需要返回
-1
0
1
。在代码片段中,我所做的只是首先检查排名。如果它们的级别相同,我会比较它们的名称,它们是
String
s,并且每个
String
都有一个
compareTo()
,按字典顺序比较两个字符串

如果不是,我们就根据等级对它们进行排序


通过使
Person
类实现
Comparable
接口,可以进一步简化
compare()
方法。这将允许您使用现成的
集合
框架商品。

回收视图中有一些实现排序的选项。当然,可以依赖
Comparable
Comparator
接口,但正如您所提到的,也可以利用Android SDK中定义的
SortedList

SortedList
的目的是简化
RecyclerView
中元素的排序,允许您截取重要事件,如“添加新项目”、“删除项目”等

在您的情况下,您可以按照以下步骤进行:

  • 定义用于包装等级和名称的Person类。请注意,在这个版本中,我假设秩有整数值,但很容易移动到十进制值

    class Person {
    
        private String rank;
        private String name;
    
        public Person(String rank, String name) {
            this.rank = rank;
            this.name = name;
        }
    
        // getters and setters here
    
    }
    
  • 定义要在其中生成
    RecyclerView
    和相应适配器的活动。在这个例子中,我包括了一个
    FloatingActionButton
    ,用于插入新的随机人员。如您所见,在创建新的
    Person
    时,会在适配器上调用方法
    addPerson
    。其作用是更新
    RecyclerView
    ,根据适配器本身定义的标准对其进行排序(参见第3点)


  • 希望这能有所帮助。我已经为您的
    RecyclerView
    提供了一个实现,以防您需要有关代码的更多详细信息。

    您好,谢谢您的回答。因此,作为一个方法,当我在创建时调用它时,我是否将customadapter类作为参数传递?另外,由于排名文本视图是一个字符串,因为它包含一个数字和单词,所以我得到一个错误,它说我不能在字符串上使用>。另外,谢谢