排序listview的最佳方式

时间:2017-03-08 13:42:58

标签: java android sorting listview arraylist

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

现在我从我的观点来看,通过愚蠢的方式,我每次都从数据库中重新选择数据,按照某个特定的订单字段排序,如果名称字段包含&#34,则= 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;
          }
        }
      });
    }

1 个答案:

答案 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是&#34;小于&#34; m2(这意味着,如果m1必须在排序前m2之前),1如果m1是&#34;大于&#34; m2m1必须在m2之后排序),或0如果他们被认为是&#34;相等&#34; (当我排序时,m1m2的顺序并不重要。在这种情况下,我使用compareToString,因为它使用字符串执行相同的逻辑。 如果我致电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相同的逻辑。

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