我正在开发一个应用程序,我需要获取一个文件列表,从中读取一些数据,并在ListView中显示所有这些基于该数据排序的文件。
问题是它们可能有很多,所以加载它们需要时间。我可以选择异步加载它们(在一个线程中),或者显示一个加载框。我遇到第一个问题:ArrayAdapter
正在填充,然后排序到最后,所以当所有项目都在那里时,列表没有排序。我想到的解决方案是:
我想在每次插入一个项目时对列表进行排序,但这样会使进程更慢......但是再次,有this,但我不确定我是怎么理解的使用这样的排序算法。
使用某种排序数组,如上所述here。我不确定如何使用ArrayAdapter
来实现它。
忘记使用线程填充ListView
。只需添加“正在加载”消息或根本不添加任何消息。
将数据存储在数据库中的文件中,并保存文件的路径,并读取数据库中的所有条目。但我不确定这会让这个过程更快......
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();
我需要您对我应该使用哪种解决方案的反馈,以及如何使用前两种解决方案(如果我应该使用它们)?
非常感谢。
答案 0 :(得分: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))
。
答案 1 :(得分:0)
也许您可以使用TreeMap或TreeSet。当一个项目被添加到树中时,它将被添加到正确的位置,以便列表保持排序。