在迭代器上使用prev()但在next()上没有错误时,java.util.NoSuchElementException

在迭代器上使用prev()但在next()上没有错误时,java.util.NoSuchElementException,java,android,android-studio,Java,Android,Android Studio,我的android应用程序中有一个视频播放器,我有上一个和下一个按钮。但是,prev按钮会出现以下错误: Uri video = Uri.parse(String.valueOf(listIterator.previous())); 02-26 07:15:11.519 32576-32576/com.example.espina.momshie E/AndroidRuntime:致命异常:主 流程:com.example.espina.momshie,PID:32576 java.util.

我的android应用程序中有一个视频播放器,我有上一个和下一个按钮。但是,prev按钮会出现以下错误:

Uri video = Uri.parse(String.valueOf(listIterator.previous()));
02-26 07:15:11.519 32576-32576/com.example.espina.momshie E/AndroidRuntime:致命异常:主 流程:com.example.espina.momshie,PID:32576 java.util.NoSuchElementException 在 java.util.AbstractList$FullListIterator.previous(AbstractList.java:130) com.Welcome.Video$3.onClick(Video.java:148) 在android.view.view.performClick上(view.java:4848) 在android.view.view$PerformClick.run(view.java:20262) 位于android.os.Handler.handleCallback(Handler.java:815) 位于android.os.Handler.dispatchMessage(Handler.java:104) 位于android.os.Looper.loop(Looper.java:194) 位于android.app.ActivityThread.main(ActivityThread.java:5647) 位于java.lang.reflect.Method.invoke(本机方法) 位于java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

Uri video = Uri.parse(String.valueOf(listIterator.previous()));
当我使用迭代器以相同的方式实现两个对象prev()和next()时,我的代码如下:

   Button next = (Button) findViewById(R.id.next);
        next.setOnClickListener(new View.OnClickListener() {


            CheckBox chck = (CheckBox) findViewById(R.id.checkBox);
            ListIterator listIterator = listA.listIterator();
            ListIterator listIterator1 = listB.listIterator();


            public void onClick(View v) {


                    Uri video = Uri.parse(String.valueOf(listIterator.next()));
                    videoView.setVideoURI(video);
                    videoView.start();
                    String text = String.valueOf(listIterator1.next());
                    textView4.setText(text);





            }
        });



        Button back = (Button) findViewById(R.id.prev);
        back.setOnClickListener(new View.OnClickListener() {


            ListIterator listIterator = listA.listIterator();
            ListIterator listIterator1 = listB.listIterator();


            public void onClick(View v) {

                    Uri video = Uri.parse(String.valueOf(listIterator.previous()));
                    videoView.setVideoURI(video);
                    videoView.start();
                    String text = String.valueOf(listIterator1.previous());
                    textView4.setText(text);





            }
        });
Uri video = Uri.parse(String.valueOf(listIterator.previous()));
错误来自以下行:

Uri video = Uri.parse(String.valueOf(listIterator.previous()));

我在这里使用迭代器有什么错?非常感谢您的帮助,非常感谢

您正在创建迭代器的两个实例,每个按钮一个。所以,当你按下prev键时,你试图进入索引-1。这让你崩溃了。您需要做两件事:

Uri video = Uri.parse(String.valueOf(listIterator.previous()));
1) 对两个按钮使用相同的迭代器

Uri video = Uri.parse(String.valueOf(listIterator.previous()));
2) 为了安全起见,在调用previous之前,请始终检查hasPrevious(hasNext和next的情况相同),这样您在两个方向上都不会超出列表

Uri video = Uri.parse(String.valueOf(listIterator.previous()));
真正的可用性是可选的

Uri video = Uri.parse(String.valueOf(listIterator.previous()));
3) 无论何时更改迭代器,都要调用next.setEnabled(iterator.hasNext())和prev.setEnabled(iterator.hasPrevious()),以便禁用不起作用的按钮

Uri video = Uri.parse(String.valueOf(listIterator.previous()));

4) 对这两个按钮使用StateListDrawables,以便禁用的按钮自动变灰。

在实际访问之前,我们需要使用和检查列表中是否存在上一个/下一个元素,以避免java.util.NoTouchElementException

谢谢@Gabe这是有效的,但是我对说明3和4感到困惑。我所知道的是在鼠标点击后设置按钮,例如:,但是我如何做第4项呢?
Uri video = Uri.parse(String.valueOf(listIterator.previous()));