2012-03-28 103 views
26

我有一個列表視圖連接到自定義陣列適配器。這份清單顯示通過改變DataSet中的TCP連接接收到的信息......排序列表視圖與陣列適配器

我可以列表視圖與sort (Comparator<? super T> comparator)排序,但是當這些數據改變時,列表視圖中沒有更多的分類......

每次dataSet被更改時我都可以使用sort(),但我認爲這不是最好的選擇...

我該怎麼做?有什麼建議麼?

編輯

我有落實解決的問題提出了...

MyComparatorB.java

public class MyComparatorB implements Comparator<DeviceB> { 

private byte orderType; 

public MyComparatorB(byte type) { 

    this.orderType = type; 

} 

public int compare(DeviceB lhs, DeviceB rhs) { 

    int res = 0; 
    if (orderType == SortType.ALPHA) { 
      res = (lhs.getName()).compareTo(rhs.getName()); 
     } 
     else if (orderType == SortType.LAST_ACT) { 
      res = (rhs.getTime().getTime()).compareTo(lhs.getTime().getTime()); 
     } 
     return res; 
    } 

} 

摘錄我customArrayAdapter.java的

@Override 
public void notifyDataSetChanged() { 
    super.notifyDataSetChanged(); 
} 


//-----------Order the content of the arrayAdapter------------// 
public void sort(byte sortType) { 

    super.sort(new MyComparatorB(sortType)); 
    notifyDataSetChanged(); 
} 

在我MyActivity.java

myDevAdapter.sort(SortType.ALPHA); 

當我調試,該方法super.sort(new MyComparatorB(sortType));被稱爲和MyComparatorB的構造函數被調用了。但方法compare(DeviceB lhs, DeviceB rhs)永遠不會被調用,我的arrayList不排序... 我做錯了什麼?

+0

爲什麼你不使用ArrayList並對數組和列進行排序! – Behnam 2012-03-28 11:28:22

+0

我想你應該排序你的數組,並調用adapter.notifyDataSetChanged() – 2012-03-28 11:29:31

+0

@amp:什麼是SortType在這裏? – YuDroid 2012-12-11 05:43:40

回答

38

我猜你需要重寫notifyDataSetChanged在適配器方法和執行排序正確調用其超級之前。請看下圖:

@Override 
public void notifyDataSetChanged() { 
    //do your sorting here 

    super.notifyDataSetChanged(); 
} 

這樣做,只要你撥打notifyDataSetChanged方法來刷新列表項目將列表進行排序。否則,將已排序的列表/數組提供給您的適配器。


或者更優選地,使用適配器中的sort方法來完成工作。

adapter.sort(new Comparator<String>() { 
    @Override 
    public int compare(String lhs, String rhs) { 
     return lhs.compareTo(rhs); //or whatever your sorting algorithm 
    } 
}); 
+0

每次dataSet被更改時,唯一的方法是調用'super.sort(comparator)'方法嗎? – amp 2012-03-28 13:36:00

+0

是的,在調用super.notifyDataSetChanged之前添加它,以便您的數據每次都被排序 – waqaslam 2012-03-28 13:36:52

+19

.sort函數自動調用notifyDataSetChanged,因此如果您使用此代碼並進行內置排序,您將進入無限循環並溢出你的堆棧。 只有在你自己管理列表的情況下才能做到這一點,但大多數使用數組適配器的人都沒有這樣做。 – elBradford 2013-08-28 03:30:04

0

由於適配器填充ListView,唯一的方法是以有序方式傳遞數據對象。

0

一旦對listView進行了排序,就可以從您的活動中調用adapter.notifyDataSetChanged()。

5
  • 數據存儲到一個ArrayList
  • 附加陣列到適配器
  • 排序陣列,並分配給自身
  • 使用notifyDataSetChanged()刷新適配器
3

這對我的作品

@Override 
public void notifyDataSetChanged() { 
    this.setNotifyOnChange(false); 

    this.sort(new Comparator<String>() { 
     @Override 
     public int compare(String lhs, String rhs) { 
      return lhs.compareTo(rhs); 
     } 
    }); 

    this.setNotifyOnChange(true); 
} 
0

Per elBradford對此的評論由於notifyDataSetChanged()方法導致堆棧溢出的可能性,我最終重寫了ArrayAdapter的add()方法,以確保這些項目在逐個添加時保持排序的一致性。 (當調用addAll()時,我在先排序項目;但我想你也可以重載addAll())。

@Override 
    public void add(ListThing object) { 
     super.add(object); 
     this.sort(ListThing.sComparator); 
    } 
0

基於waqaslamKristianR的回答是:

@Override 
public void notifyDataSetChanged() { 
    this.setNotifyOnChange(false); 

    this.sort(new Comparator<String>() { 

     @Override 
     public int compare(String s1, String s2) { 
      return s1.compareTo(s2); 
     } 
    }); 

    super.notifyDataSetChanged(); 
    this.setNotifyOnChange(true); 
} 

希望它能幫助。