对列表视图进行排序的最佳方法
我将ListView连接到自定义ArrayAdapter。 也在这个片段上,我有TextView按名称排序项目。 目前它在下一种风格工作,当我在此TextView中输入任何文本时我正在更改SQL请求的排序顺序,如下所示: 在第一个位置,我显示包含“已输入文本”的项目,之后所有其他项目。对列表视图进行排序的最佳方法
现在我从我的观点来看,以愚蠢的方式,我每次都从数据库重新选择数据,并按某个特定顺序字段排序,如果名称字段包含“输入的文本”,并且= 0如果不包含。
有人可以告诉我,如果可以对ArrayList进行排序而不重新选择数据库中的数据吗?
这里是我的解决方案:
if (mActualFilter.equals("")) {
Collections.sort(mProductItems, new Comparator<ProductItem>() {
@Override
public int compare(ProductItem o1, ProductItem o2) {
return o1.getName().compareToIgnoreCase(o2.getName());
}
});
} else {
Collections.sort(mProductItems, new Comparator<ProductItem>() {
@Override
public int compare(ProductItem o1, ProductItem o2) {
String mName1 = o1.getName();
String mName2 = o2.getName();
if ((mName1.toLowerCase().contains(mActualFilter.toLowerCase())) && (!mName2.toLowerCase().contains(mActualFilter.toLowerCase()))) {
return -1;
} else if ((!mName1.toLowerCase().contains(mActualFilter.toLowerCase())) && (mName2.toLowerCase().contains(mActualFilter.toLowerCase()))) {
return 1;
} else {
return 0;
}
}
});
}
不会根据用户的输入数据的变化?
如果它改变了,那么你别无选择,只能重新选择数据。
如果不改变,你可以使用排序在java.util.Collections.sort(array, comparator)
阵列(你可以创建排序根据你需要的字段自定义的比较)
实例(假设我有2场一类):
class MyClass {
private String someField;
private int otherField;
// getters and setters, etc..
}
我可以创建一个比较someField
比较:
Comparator<MyClass> someFieldComparator = new Comparator<MyClass>() {
@Override
public int compare(MyClass m1, MyClass m2) {
return m1.getSomeField().compareTo(m2.getSomeField());
}
};
方法compare
必须返回-1
如果m1
是“小于” m2
(这意味着,如果m1
必须m2
之前当我排序),1
如果m1
是m2
“大于”(m1
必须m2
后,当我排序),或0
如果它们被认为是“相等”(当我排序时,m1
和m2
的顺序无关紧要)。在这种情况下,我使用String
类的compareTo
,因为它使用字符串执行相同的逻辑。 如果我拨打Collections.sort(list, someFieldComparator)
,它将根据someField
的值进行排序。
otherField
对于,我可以创建另一比较:
Comparator<MyClass> otherFieldComparator = new Comparator<MyClass>() {
@Override
public int compare(MyClass m1, MyClass m2) {
int v1 = m1.getOtherField();
int v2 = m2.getOtherField();
if (v1 < v2) {
return -1;
}
if (v1 > v2) {
return 1;
}
return 0;
}
};
注意,我使用的返回-1
,1
或0
如上所述的相同的逻辑。
因此,您可以根据需要创建尽可能多的比较器并相应地使用它们。
没有数据没有改变。你能举例说明如何为我的情况做到这一点。所有我发现了什么是未来:Collections.sort(mProductItems,新的比较
我在答案中包含了一些代码。但我也建议查看文档:https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html – 2017-03-08 14:12:34
感谢您的帮助。有用。我的第一条消息代码 –
的[如何排序在Java中的ArrayList]可能的复制(http://stackoverflow.com/questions/18441846/how-to-sort-an-arraylist-in-java) – Devrim
是否有再大的开销 - 查询数据库?看起来你会增加不必要的复杂性 - 如果在对ArrayList排序后底层数据发生了变化,会发生什么情况,那么必须重新查询,然后重新排序ArrayList的数据。 –
不,它不是很大的开销,只是从我的感觉来看问题,也许我们有更优雅的方式。如果不是,我会像现在一样离开它。我的数据没有改变,直到我关闭这个片段 –