簡體   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