1

设想

我有一个类变量arraylist,当我调用搜索时,它将从某个 serviceProvider 填充,当达到最大结果时,它将停止接收结果。

serviceProvider 以数据块的形式提供数据。

每次我从 serviceProvider 获得一个结果集时,这个 arrayList 都会与提供者提供的新数据集一起添加。

然后,通过将此 arrayList 传递给模型中的临时列表,这将显示在我的视图中。

因此,每当我得到一个结果集(或一大块结果)时,我的 arrayList 都会更新,然后我将清除模型中的 tempList 并将新的 set arrayList 添加到 tempList 中,然后重新绘制列表。

我为用户提供了在搜索过程中对列表进行排序的功能,但这实际上造成了我的问题。


问题

java.lang.ArrayIndexOutOfBoundsException
        at java/util/Collections.sort(Ljava/util/List;Ljava/util/Comparator;)V (:0:59)
        at com/test/utility/Utility.sortList(ILjava/util/List;)V (Utility.java:517:175)
        at com/test/model/contentdiscovery/SearchModel.SortSearchResults()V (SearchModel.java:701:154)  

所以发生的事情是,在搜索过程中,我对列表进行了排序 AZ,然后对列表进行了排序 ZA,在完成此操作时列表正在更新。

所以我在代码中做了什么:

SortSearchResults()
{
    Utility.sortList(sort_A_Z, arrayList);  
}

哪个叫

Collections.sort(arrayList, new TitleComparatorAtoZUI());

然后当我将排序选项更改为排序 ZA

SortSearchResults()
{
    Utility.sortList(sort_Z_A, arrayList); 
}

哪个叫

Collections.sort(arrayList, new TitleComparatorZtoAUI());  

但是每个步骤中的 arrayList 可能会添加更多元素。


问题

如何解决这个问题呢?请指教。
我尝试过同步方法Utility.sortListSearchModel.SortSearchResults(). 它仍然产生了问题。

所以我总是不断地将对象添加到arrayList,但是我的视图然后将这个arrayList过滤到它的tempList中(通过每次我们得到一个新的结果集时清除并再次添加它)。

因此,当我们进行排序时,会提供 arrayList 进行排序,完成后,我们将再次将排序后的 arrayList 过滤掉到 tempList(通过清除并再次添加它)。

4

3 回答 3

5

我相信解决它的最佳方法是将视图与模型分开 - 不要工作/修改列表的相同副本。因此,您的事实来源是模型,每次用户要求以排序方式呈现视图时,视图都会得到一份副本。然后视图可以在不影响模型的情况下对本地副本进行排序。如果您想要 100% 同步,那么您可以实现一个回调,以便在您保留在模型中的列表的块更新结束时调用。然后视图将检索一个新更新的列表,对其进行排序并重新填充视图。

于 2013-10-16T11:34:35.503 回答
0

在视图中进行排序,即:排序 templist 而不是 arraylist

于 2013-10-16T11:50:05.943 回答
0

同步必须在同一个对象上。您可以将列表用作监视器:

synchronized(arrayList) {
     Utility.sortList(sort_A_Z, arrayList);
}

...

synchronized(arrayList) {
    // the code that adds more results
}

或者,您可以为此目的创建一个实用程序对象,并使用锁定和释放它的方法。

于 2013-10-16T11:29:40.677 回答