2017-03-21 63 views
1

我已经实施FirebaseRecyclerAdapter为动态recyclerView,而当我试图从列表中删除一个项目,最初在错误索引项目被删除,并删除更多项目后,我越来越IndexOutOfBoundsException。我已经尝试了所有我发现的解决方案,可以在populateViewHolder()方法中看到。请,如果你必须downvote,至少给出一个正确的答案,并减少它,因为我已经尝试了所有可能的解决方案。下面我张贴我的代码。请看一看。RecyclerView索引不更新,同时删除项目使用FirebaseRecycleradapter

检查delete.setOnClickListener()

 adapter = new FirebaseRecyclerAdapter<Slc, viewHolder>(
       Slc.class, 
       R.layout.single_slc_row, 
       viewHolder.class, 
       FirebaseDatabase.getInstance().getReference().child("DCU")) { 
      @Override 
      protected void populateViewHolder(final viewHolder viewHolder, final Slc model, final 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); 
        } 
       }); 
       String s=adapter.getRef(position).getKey(); 
       viewHolder.name.setText(s); 

       //dimming get 
       viewHolder.dimming.setProgress(model.getPercentage()); 

       //on off get 
       if(model.getON_OFF()==1) 
       { 
        viewHolder.onOff.setChecked(true); 
       } 
       else if(model.getON_OFF()==0) 
       { 
        viewHolder.onOff.setChecked(false); 
       } 

       //dimming set 

       //viewHolder.dimming.incrementProgressBy(10); 
       viewHolder.showProgress.setText(viewHolder.dimming.getProgress()+"%"); 
       viewHolder.dimming.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
        @Override 
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) 
        { 
         if(position!=RecyclerView.NO_POSITION) 
         { 
          if(seekBar.isShown() && fromUser) 
          { 
           progress= (progress/10)*10; 
           adapter.getRef(position).child("Percentage").setValue(progress); 

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


        } 

        @Override 
        public void onStartTrackingTouch(SeekBar seekBar) { 

        } 

        @Override 
        public void onStopTrackingTouch(SeekBar seekBar) { 

        } 
       }); 

       viewHolder.onOff.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

        @Override 
        public void onCheckedChanged(CompoundButton buttonView, 
               boolean isChecked) { 

         if(buttonView.isPressed() &&isChecked){ 
          adapter.getRef(position).child("ON_OFF").setValue(1); 


         }else{ 
          adapter.getRef(position).child("ON_OFF").setValue(0); 

         } 

        } 
       }); 
       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(position).getKey(); 
         delete.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) 
          { 
           // int pos = viewHolder.getAdapterPosition(); 

           ref.child(key).setValue(null); 



//        int selectedItems = position; 
//        for (int i = selectedItems; i >= selectedItems; i--) { 
//         adapter.getRef(i).removeValue(); 
            adapter.notifyItemRemoved(position); 
//        } 
//        adapter.getRef(position).removeValue(); 
// 
//        adapter.notifyItemRemoved(position); 

           // adapter.notifyDataSetChanged(); 

           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.setAdapter(adapter); 

我删除某些项目后获得的例外:

java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2 
                       at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
                       at java.util.ArrayList.get(ArrayList.java:308) 
                       at com.firebase.ui.database.FirebaseArray.getItem(FirebaseArray.java:52) 
                       at com.firebase.ui.database.FirebaseRecyclerAdapter.getRef(FirebaseRecyclerAdapter.java:150) 
+1

尝试改变任何函数内任何'position'对象不能直接在'populateViewHolder'为'viewHolder .getAdapterPosition()'因为在删除某个商品后,你的位置可能会搞乱 – koceeng

+0

@koceeng:问题在于索引值,一旦删除某个商品,索引值就不会更新。你能为此提供任何解决方案吗? –

+0

我想我的建议也确保索引/位置是最新的。请先尝试一下,这样我可以更好地了解你,如果你有另一个错误。因为当我的建议失败时,你总是可以撤销权利?没什么可失的 – koceeng

回答

2

错误是由position对象的使用功能里面不能直接下造成的populateViewHolder。像这一个:(但不限于)

protected void populateViewHolder(final viewHolder viewHolder, final Slc model, final int position) { 
    // here position object is valid 
    ... 
    viewHolder.dimming.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(...) { 
      // but here, position object is likely to be incorrect 
      // especially when you add/remove item of list 
     } 
     ... 
    } 

而且简单的办法就是更换所有的position对象不能直接populateViewHolder下到viewHolder.getAdapterPosition()

注:我从我的评论将它复制的情况下,其他人寻求答案,并错过了评论