2017-04-25 1 views
0

私のアプリケーションでは、スピナーrecyclerViewがあります。スピナで選択されたアイテムに基づいて、異なるリストアイテムはとなり、recyclerViewに表示されます。recyclerViewを別のデータセットで複数回ロードしているときにエラーが発生しました

最初はスピナーのアイテム選択に基づいて、私はrecyclerViewで完全なデータを取得しています。

を例外:しかし4-5回はスピナーでデータを変更し、recyclerViewでcorrepondingリストを取得した後、私は自分のアプリケーションがダウンしてクラッシュして、次の例外を取得しています

 java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 0(offset:2).state:2 
                       at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5456) 

マイコード:

 ArrayAdapter<String> spinnerAdapter=new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item,dcuName); 
     dcuSpinner.setAdapter(spinnerAdapter); 

     final LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
     slcList = (RecyclerView)v.findViewById(R.id.addedSlcList); 
     handleDCURequest = new handleDCURequest(); 

     dcuSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, final View view, final int position, long id) 
      { 
       Query refQuery1 = ref.orderByChild("name").equalTo(dcuName.get(position)); 
       refQuery1.addChildEventListener(new ChildEventListener() { 
        @Override 
        public void onChildAdded(DataSnapshot dataSnapshot, String s) 
        { 
         slcList.getRecycledViewPool().clear(); 

         Log.d("SpinnerAdd2", dataSnapshot.getKey()); 
         dcuIDVal = dataSnapshot.getKey(); 
         adapter = new FirebaseRecyclerAdapter<slcObject, viewHolder>(slcObject.class, R.layout.single_slc_row, 
           viewHolder.class,FirebaseDatabase.getInstance().getReference().child("JSON").child("StreetLightcontrol").child(dataSnapshot.getKey()).child("DeviceList")) { 
          @Override 
          protected void populateViewHolder(final viewHolder viewHolder, slcObject model, int position) 
          { 
           //expand collapse 
// 
           viewHolder.vis.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View v) 
            { 
             // ViewAnimationsUtils.expand(viewHolder.inv); 
             viewHolder.collapse.setVisibility(View.VISIBLE); 
             viewHolder.inv.setVisibility(View.VISIBLE); 

            } 
           }); 
           viewHolder.collapse.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View v) 
            { 
             // ViewAnimationsUtils.collapse(inv); 
             viewHolder.inv.setVisibility(View.GONE); 
             viewHolder.collapse.setVisibility(View.GONE); 
            } 
           }); 
           final String slcIDVal= adapter.getRef(viewHolder.getAdapterPosition()).getKey(); 
           viewHolder.name.setText(model.getName()); 

           viewHolder.onOff.setClickable(false); 
           viewHolder.onOff.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View v) 
            { 
             if(viewHolder.onOff.isChecked()) 
             { 
              viewHolder.onOff.setChecked(false); 
              handleDCURequest.slc_onoff((Context)myContext,1, slcIDVal,dcuIDVal, viewHolder.onOff, viewHolder.dimming); 
              //Toast.makeText(myContext,"Turned On",Toast.LENGTH_LONG).show(); 
             } 
             else 
             { 
              viewHolder.onOff.setChecked(true); 
              handleDCURequest.slc_onoff((Context)myContext,0, slcIDVal,dcuIDVal, viewHolder.onOff,viewHolder.dimming); 
              // Toast.makeText(myContext,"Turned Off",Toast.LENGTH_LONG).show(); 
             } 
            } 
            }); 

           viewHolder.dimming.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 

            int originalProgress; 
            @Override 
            public void onStopTrackingTouch(SeekBar seekBar) 
            { 
             if(seekBar.isShown()) { 
              viewHolder.dimming.setEnabled(false); 
              handleDCURequest.slc_dimming((Context) myContext, slcIDVal, seekBar.getProgress(), originalProgress, dcuIDVal, viewHolder.dimming); 
// 
             } 
            } 

            @Override 
            public void onStartTrackingTouch(SeekBar seekBar) { 
             originalProgress = seekBar.getProgress(); 
            } 

            @Override 
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
             if(viewHolder.getAdapterPosition()!=RecyclerView.NO_POSITION) 
             { 
              if(seekBar.isShown() && fromUser) 
              { 
//            progress= (progress/10)*10; 
//            //ProgressUtil.showProgressDialog(progressDialog); 
//            Log.d("Seek", String.valueOf(progress)); 
//            viewHolder.dimming.setEnabled(false); 
//            handleDCURequest.slc_dimming((Context)myContext,slcIDVal,progress, originalProgress,dcuIDVal,viewHolder.dimming); 
//            //adapter.getRef(viewHolder.getAdapterPosition()).child("Percentage").setValue(progress); 

               //viewHolder.showProgress.setText(progress+"%"); 
              } 
             } 



            } 
           }); 

           viewHolder.edit.setOnClickListener(new View.OnClickListener() { 
                     @Override 
                     public void onClick(View v) { 
                      final Dialog dialog = new Dialog(myContext); 
                      dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
                      dialog.setContentView(R.layout.update_slc); 
                      dialog.setCancelable(false); 
                      Window window = dialog.getWindow(); 
                      if (window == null) return; 
                      WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); 
                      lp.copyFrom(dialog.getWindow().getAttributes()); 
                      lp.width = WindowManager.LayoutParams.MATCH_PARENT; 
                      lp.height = WindowManager.LayoutParams.WRAP_CONTENT; 
                      lp.gravity = Gravity.CENTER; 
                      dialog.getWindow().setAttributes(lp); 
                      final EditText name = (EditText) dialog.findViewById(R.id.slcNameu); 
                      final EditText lat = (EditText) dialog.findViewById(R.id.slcLatu); 
                      final EditText lng = (EditText) dialog.findViewById(R.id.slcLngu); 
                      final EditText note = (EditText) dialog.findViewById(R.id.slcNoteu); 
                      final EditText id = (EditText) dialog.findViewById(R.id.slcIDu); 
                      TextView cancel = (TextView) dialog.findViewById(R.id.cancelu); 
                      TextView update = (TextView) dialog.findViewById(R.id.updateSlc); 
                      update.setOnClickListener(new View.OnClickListener() { 
                       @Override 
                       public void onClick(View v) { 
                        final String oldSlcIDVal= adapter.getRef(viewHolder.getAdapterPosition()).getKey(); 
                        Map mParent = new HashMap(); 
                        mParent.put("name",name.getText().toString()); 
                        mParent.put("lat",lat.getText().toString()); 
                        mParent.put("log",lng.getText().toString()); 
                        mParent.put("note",note.getText().toString()); 


// 
                       } 
                      }); 
                      cancel.setOnClickListener(new View.OnClickListener() { 
                       @Override 
                       public void onClick(View v) 
                       { 
                        dialog.dismiss(); 
                       } 
                      }); 
                     } 
                    }); 


             viewHolder.delete.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View v) 
            { 
             final Dialog dialog = new Dialog(myContext); 
             dialog.setTitle("Delete Slc?"); 
             dialog.setContentView(R.layout.delete_slc); 
             dialog.setCancelable(false); 
             Window window = dialog.getWindow(); 
             if(window == null) return; 
             WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); 
             lp.copyFrom(dialog.getWindow().getAttributes()); 
             lp.width = WindowManager.LayoutParams.MATCH_PARENT; 
             lp.height = WindowManager.LayoutParams.WRAP_CONTENT; 
             lp.gravity = Gravity.CENTER; 
             dialog.getWindow().setAttributes(lp); 
             TextView delete = (TextView)dialog.findViewById(R.id.deleteSlc); 
             final String key= adapter.getRef(viewHolder.getAdapterPosition()).getKey(); 
             delete.setOnClickListener(new View.OnClickListener() { 
              @Override 
              public void onClick(View v) 
              { 
               // int pos = viewHolder.getAdapterPosition(); 
               Log.d("positionVal",viewHolder.getAdapterPosition()+""); 
               handleDCURequest.delete_slc((Context)myContext,slcIDVal,viewHolder.getAdapterPosition(), dcuIDVal,adapter); 

               dialog.dismiss(); 
              } 
             }); 


             TextView dialogButton = (TextView) dialog.findViewById(R.id.canceld); 
             // if button is clicked, close the custom dialog 
             dialogButton.setOnClickListener(new View.OnClickListener() { 
              @Override 
              public void onClick(View v) 
              { 
               dialog.dismiss(); 
              } 
             }); 

             dialog.show(); 

            } 
           }); 
          } 
         }; 
         slcList.setLayoutManager(llm); 
         adapter.notifyDataSetChanged(); 
         slcList.setAdapter(adapter); 


        } 

答えて

1

あなたのコドは、あまりにも、おそらくチャンクに分割し、長いが、あなたが取得している説明と例外に基づいています -

  • 説明:「最初はスピナーの項目の選択に基づいて、私は完璧なデータを取得しています リサイクルビュー。しかし、スピナー内のデータを変更した後に4-5回 」
  • 例外: 『はIndexOutOfBoundsException』

これは完全にあなたのRecycleViewは、データはもう移入し得るカントことを示し、それに渡された参照がありますバインドされ割り当てられたデータのうち、(例あなたが持っているデータは20ですが、25のrefrenceを渡している)。

私はあなたがポイントに実際のデータサイズをピンまたはbreakpointsを使用するか、その簡単なので、あなたのコードをリファクタリングするLog.d("Data",data.size);を使用することをお勧め私たちがそれを指摘するために:

+0

こんにちは、ほとんどの場合、アダプターが起動した後、populateViewHolderはrecyclerViewアダプターのコードです。 –

+0

この問題は非常に不安定です。その予期せぬことに、他の時代にはそこにはない。 –

+0

そのようなことが普通ですが、私はリストの読み込みと再ロード時にList上で同様の問題が発生しています。アダプタデータをクリアしたことがないため、位置とデータが不安定です。あなたのRecycleViewではクリアしますが、最初の場所でRecleViewにデータを供給するSpinnerでは決して使用しないでください:call .clear();おそらく.notifyDataSetChanged(); .clear()を呼び出した後にデータをリロードするだけです。それがうまくいくなら、私の答えは、将来の参照のために受け入れてください。乾杯。 –

関連する問題