Java 如何按最低数量/字符串对recyclerview进行排序Android Studio
我的应用程序中有一个recyclerview,它包含两个文本视图,一个是rankTextView,另一个是nameTextview。像这样的东西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,
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类作为参数传递?另外,由于排名文本视图是一个字符串,因为它包含一个数字和单词,所以我得到一个错误,它说我不能在字符串上使用>。另外,谢谢