2017-03-08 123 views
1

我将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; 
      } 
     } 
     }); 
    } 
+0

的[如何排序在Java中的ArrayList]可能的复制(http://stackoverflow.com/questions/18441846/how-to-sort-an-arraylist-in-java) – Devrim

+0

是否有再大的开销 - 查询数据库?看起来你会增加不必要的复杂性 - 如果在对ArrayList排序后底层数据发生了变化,会发生什么情况,那么必须重新查询,然后重新排序ArrayList的数据。 –

+0

不,它不是很大的开销,只是从我的感觉来看问题,也许我们有更优雅的方式。如果不是,我会像现在一样离开它。我的数据没有改变,直到我关闭这个片段 –

回答

1

不会根据用户的输入数据的变化?

如果它改变了,那么你别无选择,只能重新选择数据。

如果不改变,你可以使用排序在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如果m1m2“大于”(m1必须m2后,当我排序),或0如果它们被认为是“相等”(当我排序时,m1m2的顺序无关紧要)。在这种情况下,我使用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; 
    } 
}; 

注意,我使用的返回-110如上所述的相同的逻辑。

因此,您可以根据需要创建尽可能多的比较器并相应地使用它们。

+0

没有数据没有改变。你能举例说明如何为我的情况做到这一点。所有我发现了什么是未来:Collections.sort(mProductItems,新的比较(){ @覆盖 公众诠释比较(ProductItem O1,O2 ProductItem){ 返回0;} });但在这里,你可以看到我可以比较我的清单中的2个项目,而不是每个项目与一些自由文本 –

+0

我在答案中包含了一些代码。但我也建议查看文档:https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html – 2017-03-08 14:12:34

+0

感谢您的帮助。有用。我的第一条消息代码 –

相关问题