2017-04-25 59 views
0

在我的应用程序中,我有一个微调框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

您的合作德太长,也许把它分成块,但基于该说明和异常给你: -

  • 说明:“最初基于微调的项目选择,我 正在日臻完善数据recyclerView。然而之后的4-5倍 在微调改变数据”
  • 异常:‘IndexOutOfBoundsException异常’

这完全表明您RecycleView不能得到的数据再填充,传递给它的引用从绑定的分配的数据(例如,你拥有的数据是20,但你逝去的25 refrence)。

我建议你使用Log.d("Data",data.size);到针点实际的数据大小,或者使用breakpoints或重构你的代码,所以它很容易为我们指点一下吧:)

关于。

+0

嗨,主要是在适配器启动后,populateViewHolder内部是recyclerView适配器的代码。 –

+0

这个问题非常不稳定。它出人意料地在其他时间不在那里。 –

+0

它通常是这样的,我有类似的问题之前列表加载和重新加载列表不断增加我从来没有清除适配器数据,因此位置和数据是不稳定的,我怀疑这个问题是相同的你的情况,我已经指出你只是打电话在您的RecycleView上清除,但从不在第一次提供数据到RecleView的Spinner上:尝试调用.clear();并可能.notifyDataSetChanged();或者在调用.clear()之后执行数据重新加载。如果它有任何作品,请接受我的答案,以备将来参考以及面临类似问题的其他人。干杯。 –

相关问题