我使用的是ViewPager与FragmentStatePagerAdapter让一些片段之间的导航.
比方说,我有三个片段:A,B和C.ViewPager最初显示片段A,并允许您通过从右向左滑动,然后再次滑动到片段C来导航到片段B. 这允许以下导航路径:A <--> B <--> C.
我想要的是能够在片段A上从左向右滑动并让ViewPager显示片段C,即它表现为循环队列并允许 ... --> C <--> A <--> B <--> C <--> A <-- ...
我不希望片段在其他位置重复(即最终有三个以上的实例).
使用ViewPager可以实现这种包装功能吗?
@Test
public void testListCur(){
List<String> li=new ArrayList<String>();
for(int i=0;i<10;i++){
li.add("str"+i);
}
for(String st:li){
if(st.equalsIgnoreCase("str3"))
li.remove("str3");
}
System.out.println(li);
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我将抛出一个ConcurrentModificationException.
看起来当我从列表中删除指定的元素时,列表不知道它的大小是否已被更改.
我想知道这是集合和删除元素的常见问题吗?
for (String fruit : list)
{
if("banane".equals(fruit))
list.remove(fruit);
System.out.println(fruit);
}
Run Code Online (Sandbox Code Playgroud)
这里有一个带删除指令的循环.在执行时,我在控制台输出下面得到一些ConcurrentModificationException:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)
at java.util.AbstractList$Itr.next(AbstractList.java:420)
at Boucle.main(Boucle.java:14)
abricot
banane
Run Code Online (Sandbox Code Playgroud)
问题:如何用循环删除一些元素?
为什么这段代码没有抛出ConcurrentModificationException?它修改了一段Collection时间迭代它,而不使用Iterator.remove()方法,这是唯一安全的删除方法.
List<String> strings = new ArrayList<>(Arrays.asList("A", "B", "C"));
for (String string : strings)
if ("B".equals(string))
strings.remove("B");
System.out.println(strings);
Run Code Online (Sandbox Code Playgroud)
如果我ArrayList用a 替换,我会得到相同的结果LinkedList.但是,如果我将列表更改为("A", "B", "C", "D)或只是("A", "B")按预期获得异常.到底是怎么回事?我正在使用,jdk1.8.0_25如果这是相关的.
编辑
我找到了以下链接
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4902078
相关部分是
天真的解决方案是在AbstractList中为hasNext添加编码检查,但这会使编纂检查的成本增加一倍.事实证明,仅在最后一次迭代时进行测试就足够了,这几乎不会增加成本.换句话说,hasNext的当前实现:
Run Code Online (Sandbox Code Playgroud)public boolean hasNext() { return nextIndex() < size; }被此实现取代:
Run Code Online (Sandbox Code Playgroud)public boolean hasNext() { if (cursor != size()) return true; checkForComodification(); return false; }由于Sun内部监管机构拒绝了此项更改,因此不会进行此更改.正式裁决表明,这一变化"已证明可能对现有代码产生重大的兼容性影响." ("兼容性影响"是修复程序有可能用ConcurrentModificationException替换静默不当行为.)
如果我在使用for-each循环迭代它时修改Collection,它会给出ConcurrentModificationException.有没有解决方法?
如何从ArrayList中删除特定对象?假设我有一个如下课程:
import java.util.ArrayList;
public class ArrayTest {
int i;
public static void main(String args[]){
ArrayList<ArrayTest> test=new ArrayList<ArrayTest>();
ArrayTest obj;
obj=new ArrayTest(1);
test.add(obj);
obj=new ArrayTest(2);
test.add(obj);
obj=new ArrayTest(3);
test.add(obj);
}
public ArrayTest(int i){
this.i=i;
}
}
Run Code Online (Sandbox Code Playgroud)
如何new ArrayTest(1)从我的删除对象ArrayList<ArrayList>
我想从一个ArrayList完成它的时候删除一个对象,但我找不到办法去做.试着像下面的示例代码中删除它不想工作.我怎么能px在这个循环中找到当前对象的迭代器来删除它?
for( Pixel px : pixel){
[...]
if(px.y > gHeigh){
pixel.remove(pixel.indexOf(px)); // here is the thing
pixel.remove(px); //doesn't work either
}
}
Run Code Online (Sandbox Code Playgroud) 许多类使用类似于以下的代码来激活侦听器.
private List<Listener> listeners = new ArrayList<Listener>();
public void fireListener() {
for(Listener l : listeners) l.someMethod();
}
Run Code Online (Sandbox Code Playgroud)
这一点很好,直到侦听器尝试添加/删除侦听器.从列表内部进行的这种修改会导致a ConcurrentModificationException.我们应该处理这种情况还是应该修改听众无效?处理添加/删除侦听器的最佳方法是什么?
更新:
这是一个可能的解决方案.
public void fireListener() {
for(Listener l : listeners.toArray(new Listener[listeners.size()])) {
if(!listeners.contains(l)) continue;
l.someMethod();
}
}
Run Code Online (Sandbox Code Playgroud) public synchronized X getAnotherX(){
if(iterator.hasNext()){
X b = iterator.next();
String name = b.getInputFileName();
...
return b;
}
else{return null;}
}
Run Code Online (Sandbox Code Playgroud)
尽管声明头中的synchronized语句,我仍然在我使用iterator.next()的行中得到一个ConcurrentModificationException异常; 什么错了?