-1

私はRecyclerViewの項目をクリックするとDialogが表示され、そのタスクの名前を編集できるToDoリストアプリを作成しています。私が変更を受け入れると、アプリケーションがクラッシュし、このスタックトレースがポップアップするタスクがあります。Android RecyclerViewアダプタの位置は-1

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()); 

私はアイテムがクラッシュした上で任意のパターンを見つけるように見える傾けると、なぜ他の人don't.Hereは完全なコードです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(); 
       } 
      }); 
     } 

どうしてですか?

+0

'holder.getAdapterPosition()'を 'position'(メソッドのパラメータ)に置き換えるとどうなりますか? –

答えて

0

修正済みです。私はonDropListenerを追加しました。そして、私はnotifyOnDataSetChangedを使ってrecyclerviewを呼び出しました。次に、実際に正しい位置パラメータ値を使用します。

1

ポジションはonBindViewHolderパラメーターで使用可能です。そのパラメーターを使用してください。

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

お手数ですが、

+0

それは動作しません。それは数字を提供しますが、ほとんど常に間違った数字です。だから、iv'eはgetAdapterPosition()を使っています。私は常にアイテムをドラッグして並べ替えていますbtw – Jared

+0

あなたのアダプタクラスを教えてもらえますか? – parthi

関連する問題