繁体   English   中英

排序列表视图的最佳方式

[英]Best way for to sort listview

我有连接到自定义 ArrayAdapter 的 ListView 片段。 同样在这个片段上,我有 TextView 用于按名称对项目进行排序。 目前它在下一个样式中工作,当我在此 TextView 中输入任何文本时,我正在更改 SQL 请求的排序顺序,如下所示:在第一个位置我显示包含“输入文本”的项目,然后显示所有其他项目。

现在我从我的角度来看,以愚蠢的方式,我每次都从数据库中重新选择数据,并按某些特定的订单字段排序,如果名称字段包含“输入的文本”,则 = 1,如果不包含,则 = 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)对 Array 进行排序(并且您可以创建根据您需要的字段进行排序的自定义比较器)

示例(假设我有一个包含 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是“大于” m2m1必须是后m2时我排序),或0如果它们被认为是“相等的”(排序时m1m2的顺序无关紧要)。 在这种情况下,我使用了String类的compareTo ,因为它对字符串执行相同的逻辑。 如果我调用Collections.sort(list, someFieldComparator) ,它将根据someField值进行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逻辑。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM