我正在编写 android 应用程序,它在 1 个图中绘制 4 个图形。图形数据存储在对象 GraphViewData(x,y) 中。我还有包含 4 个 GraphVieData 对象的列表。
我想让用户能够关闭/打开某些图表。
我尝试编写 myList.set(index, null) 来隐藏图形,然后编写 myList.set(index, myObject) 以再次显示它,但每次列表大小都在变化。所以我遇到了 IndexOutOfBound 异常。
请告诉我为什么列表大小会发生变化?这是 List.set() 的描述:
Replaces the element at the specified location in this List with the specified object. This operation does not change the size of the List.
代码:
public void removeSerie(int id){
graphSeries.set(id, null);
Log.d("CurrentListSize: ", graphSeries.size() + "");
}
public void addSerie(GraphViewData series, int id){
graphSeries.set(id, series);
}
最佳答案
List.set(int, T)
的 javadoc 在 Java 之间存在差异和 Android .这令人担忧,但您应该按以下方式解决它:
Oracle 版本的 javadoc 是 Java 的最终版本。
List
实现允许更改集合中的列表大小。Android 版本的 javadoc 应被视为不正确作为 Java 的来源。您可能会争辩说它对 Android 来说是正确的,但是如果您处理的代码不是专门为 Android 编写的,那并没有多大帮助。 (例如,为 Java 编写然后为 Android 编译的代码。)
Java 和 Android 中的标准
List
类不会执行此操作。 (检查源代码以确保万无一失,但如果其中任何一个在没有 javadoc 说明的情况下这样做,我会感到非常惊讶。)自定义/第 3 方
List
类可以执行此操作,并且仍然遵循 JavaList
约定(尽管可以说不是Android 合约)。不保证自定义/第 3 方
List
类将遵循任一契约(Contract)。这使整个论点变得毫无意义……除非您可以说服相关作者/供应商更改相关列表类别。 (祝你好运,因为它可能会破坏其他人的代码!!)
那你该怎么办?我推荐:
如果您希望能够使用
set
执行此操作,请确保您使用的是支持它的列表类。必要时检查列表类的代码。否则,请更改您的算法。
关于Java List.set() 改变列表大小。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9137227/