【问题标题】:Android RecyclerView Adapter Position is -1 [duplicate]Android RecyclerView适配器位置为-1 [重复]
【发布时间】:2017-02-10 20:21:47
【问题描述】:

我正在制作一个待办事项列表应用程序,如果我单击RecyclerView 中的一个项目,Dialog 将弹出,让您编辑该任务的名称。在某些任务上,当我接受更改时,应用程序崩溃并弹出此堆栈跟踪。

10-02 15:10:34.801 9701-9701/com.gigstudios.todolist E/AndroidRuntime: FATAL EXCEPTION: main
                                                                       Process: com.gigstudios.todolist, PID: 9701
                                                                       java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
                                                                           at java.util.ArrayList.get(ArrayList.java:310)
                                                                           at com.gigstudios.todolist.RecyclerListAdapter$3$1.onInput(RecyclerListAdapter.java:166)
                                                                           at com.afollestad.materialdialogs.MaterialDialog.onClick(MaterialDialog.java:370)
                                                                           at android.view.View.performClick(View.java:5201)
                                                                           at android.view.View$PerformClick.run(View.java:21163)
                                                                           at android.os.Handler.handleCallback(Handler.java:746)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                           at android.os.Looper.loop(Looper.java:148)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5443)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

这是因为 getAdapterPostion 返回 -1 而导致崩溃的行:

taskList.getTasks().get(holder.getAdapterPosition()).setTitle(input.toString().trim());

我似乎找不到任何关于哪些项目崩溃以及为什么其他项目没有崩溃的模式。这是onBindViewHolder 的完整代码。

 @Override
        public void onBindViewHolder(final ItemViewHolder holder, final int position) {

            //other code




            //edit task
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    new MaterialDialog.Builder(context)
                            .title(R.string.edit_task)
                            .inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES)
                            .inputRange(0, 300)
                            .positiveText(R.string.save)
                            .negativeText(R.string.cancel)
                            .input(context.getString(R.string.task_title), holder.textView.getText().toString(), new MaterialDialog.InputCallback() {
                                @Override
                                public void onInput(@NonNull MaterialDialog dialog, CharSequence input) {
                                    //Edit Task
                                    taskList.getTasks().get(holder.getAdapterPosition()).setTitle(input.toString().trim());
                                    notifyItemChanged(holder.getAdapterPosition());

                                    //save
                                    save();
                                }
                            }).show();
                }
            });
        }

为什么会这样?

【问题讨论】:

  • 如果将holder.getAdapterPosition()替换为position(方法中的参数)会怎样?

标签: java android android-recyclerview adapter indexoutofboundsexception


【解决方案1】:

您的onBindViewHolder参数可以使用该位置,请尝试使用该位置。

 taskList.getTasks().get(position).setTitle(input.toString().trim());

也许对你有帮助。

【讨论】:

  • 那行不通。它提供了一个数字,但它几乎总是错误的数字。这就是为什么我一直在使用 getAdapterPosition()。我不断地拖动和排序项目顺便说一句
  • 你能告诉我你的适配器类吗..
【解决方案2】:

修复它。我添加了一个 onDropListener 并且我只是 notifyOnDataSetChanged 回收器视图。然后我使用实际正确的位置参数值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多