IndexOutOfBoundsException on getRef().removeValue in FirebaseRecyclerAdapter

IndexOutOfBoundsException on getRef().removeValue in FirebaseRecyclerAdapter

我遇到了这个异常:

java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0

使用此代码时:

mAdapter = new FirebaseRecyclerAdapter<Campaign, CampaignHolder>(Campaign.class, R.layout.recyclerview_template, CampaignHolder.class, ref) {
        @Override
        public void populateViewHolder(final CampaignHolder viewHolder, final Campaign campaign, final int position) {
            final String key = campaign.x;
            FirebaseDatabase.getInstance().getReference().child("x").addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (!dataSnapshot.hasChild(key)) {
                        getRef(position).removeValue(new DatabaseReference.CompletionListener() { //Crash here
                            @Override
                            public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
                                if (databaseError != null)
                                    FirebaseCrash.report(databaseError.toException());
                                else{
                                    if (mAdapter.getItemCount() == 0){
                                        v.findViewById(R.id.empty).setVisibility(View.VISIBLE);
                                    }
                                }

                            }
                        });

                        return;
                    }
                    //...
            }

在这一行:

  getRef(position).removeValue(new DatabaseReference.CompletionListener() {

(我用 x 替换了一些字符串,因为我想保密)


导致此问题的原因是什么?我该如何解决?

我把这个解决了:

DatabaseReference ref = getRef(position);

内部class之外,然后使用ref代替getRef()。至少我认为这为我解决了。

此问题的正确解决方案在这里:

You should not use position outside of populateViewHolder as it value may differ. Instead, make your viewHolder final and use viewHolder.getAdapterPosition() to replace it.