2012-05-14 38 views
1

我正在開發一個應用程序,我需要獲取文件列表,從中讀取一些數據,並根據這些數據在ListView中顯示所有這些文件。如何在Java中以有序方式異步填充數組?

問題是可能有很多它們,所以它們都需要時間加載它們。我可以選擇將它們異步加載(在一個線程中),或者顯示一個加載框。我遇到第一個問題:ArrayAdapter正在填充,然後在最後排序,所以到時候所有的項目都在那裏,列表沒有排序。我想到的解決方案是:

  1. 我想我每次插入項目時的排序名單,但是這將使得過程更慢......但同樣,有this,但我不知道我明白如何使用這種排序算法。

  2. 使用某種有序的數組,如here所述。我不知道如何/如果我能用ArrayAdapter來實現它。

  3. 忘記使用線程填充ListView。只需添加「加載」消息或完全沒有。

  4. 將數據中的數據存儲在數據庫中,並保存文件的路徑,並讀取數據庫中的所有條目。但我不知道這將會使過程更快...

 
la = new ArrayAdapter(this, R.layout.list_item); 
setListAdapter(la); 

Handler handler = new Handler() { 
    public void handleMessage(Message message) { 
     switch (message.what) { 
     case TrackBrowser.DID_SUCCEED: { 
      // This is called when the thread is done finding the list of items 
      // mComparator is my own Comparator 
      la.sort(mComparator); 
      break; 
     } 
     case TrackBrowser.ADD: { 
      // This is called everytime an item is parsed 
      TrackBrowser.TrackView tv = (TrackBrowser.TrackView) message.obj; 
      la.add(tv); 
      // Should I sort here everytime? 
      //la.sort(mComparator); 
      break; 
     } 
     } 
    } 
}; 

// This class just loops through the files returned by listFiles and sends messages. 
TrackBrowser tb = new TrackBrowser(handler); 
Thread thread = new Thread(tb); 
thread.start(); 

我需要你的哪種解決方案,我應該使用,以及如何使用反饋前兩個(如果我要使用它們) ?

非常感謝。

回答

1

您可以使用二分查找找到插入新元素的適當位置。 因此,該列表總是排序。

例如:

public static void add(List<Integer> list, Integer value) { 
    int index = Collections.binarySearch(list, value); 
    list.add((index < 0) ? (-index - 1) : index, value); 
} 

public static void main(String[] args) { 
    List<Integer> list = new ArrayList<Integer>(); 

    add(list, 1); 
    add(list, -5); 
    add(list, -7); 
    add(list, 100); 
    add(list, 0); 
    add(list, 90); 
    add(list, -10); 
    add(list, 0); 
    add(list, 1); 

    System.out.print(list); 
} 

然後你會得到一個輸出這樣的:

[-10, -7, -5, 0, 0, 1, 1, 90, 100]

它工作正常。在最壞的情況下,二進制搜索需要O(log(N))並且插入需要O(N)(因爲當您插入新元素時,可能會發生列表中重定位元素)。因此,需要O(N + log(N))時間。當您每次對列表進行排序時,它優於O(N*log(N))

+0

性能有多好呢?你能舉一個小例子嗎?類似於'i = Collections.binarySearch(myList,newItem,myCustomComparator); myList.add(i,newItem);'? – jadkik94

+0

@ jadkik94我已經更新了我的答案。 – Zheka

+0

好的。謝謝。我想它應該與其他整數一起工作。但這是如何工作的?我認爲binarySearch返回'value'的索引(如果它存在),如果不是'-1',則返回'value'的索引。如果是這樣,那麼爲什麼您的示例中的100最後會結束? – jadkik94

0

也許你可以使用TreeMap或TreeSet。當一個項目被添加到樹中時,它被添加到正確的位置,以便列表保持排序。

+0

我需要類似於列表的東西,所以它不是TreeMap。但是,我如何使用適配器(ListAdapter或ArrayAdapter)的TreeSet? – jadkik94

+0

我查了一下,我可能需要從BaseAdapter繼承,因爲ArrayAdapter期望沒有任何東西或List被傳遞...如果你知道另一種方式... – jadkik94