2017-03-08 124 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

感謝您的幫助。有用。我的第一條消息代碼 –

相關問題