方案
我有一个类变量 arraylist ,当我调用搜索时会从某个serviceProvider填充,当达到最大结果时,它将停止接收结果。
serviceProvider以数据块的形式提供数据。
每次从serviceProvider获取结果集时,都会使用提供程序提供的新数据集添加此arrayList。
然后通过将此arrayList传递给我的模型中的templist,在我的视图中显示。
所以每当我得到一个结果集(或一大堆结果),我的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)
所以发生了什么,当搜索正在进行中时,我在列表上做了一个排序A-Z,然后我在列表上做了一个排序Z-A,列表在这个过程中得到了更新。
所以我在代码中做了什么:
SortSearchResults()
{
Utility.sortList(sort_A_Z, arrayList);
}
哪个叫
Collections.sort(arrayList, new TitleComparatorAtoZUI());
然后当我将sort选项更改为Sort Z-A
时SortSearchResults()
{
Utility.sortList(sort_Z_A, arrayList);
}
哪个叫
Collections.sort(arrayList, new TitleComparatorZtoAUI());
但是每个步骤中的arrayList可能会添加更多元素。
问题
如何解决这个问题?请指教。
我尝试过同步Utility.sortList
和SearchModel.SortSearchResults()
两种方法。它仍然造成了这个问题。
所以我总是继续将对象添加到arrayList,但是我的视图然后将这个arrayList过滤到它的tempList(通过每次获取新的结果集时清除并再次添加它)。
因此,当我们进行排序时,arrayList被提供用于排序,当它完成时,我们将再次将排序的arrayList过滤到tempList(通过清除并再次添加它)。
答案 0 :(得分:5)
我认为解决问题的最佳方法是将View与模型分开 - 不要工作/修改列表的同一副本。因此,您的真实来源是模型,每当用户要求以排序方式呈现它时,视图将获得副本。然后,视图可以对本地副本进行排序,而不会影响模型。如果您希望100%同步,则可以在模型中保留的列表的块更新结束时实现要调用的回调。然后视图将检索新更新的列表,对其进行排序并重新填充视图。
答案 1 :(得分:0)
同步必须位于相同的对象上。您可以使用列表作为监视器:
synchronized(arrayList) {
Utility.sortList(sort_A_Z, arrayList);
}
...
synchronized(arrayList) {
// the code that adds more results
}
或者,您可以为此目的创建一个实用程序对象,并使用锁定和释放它的方法。
答案 2 :(得分:0)
在视图中进行排序,即:对临时列表进行排序,而不是对arraylist进行排序