FirebaseRecyclerAdapter中的getRef()。removeValue的IndexOutOfBoundsException

时间:2016-09-20 12:00:25

标签: android firebase firebase-realtime-database indexoutofboundsexception firebaseui

我遇到了这个例外:

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替换了一些字符串,因为我想让它们保密:

造成这个问题的原因是什么?我该如何解决?

2 个答案:

答案 0 :(得分:0)

我把它解决了:

DatabaseReference ref = getRef(position);

在内部类之外,然后使用ref而不是getRef()。这对我来说是解决了,至少我认为。

答案 1 :(得分:0)

此问题的正确解决方案如下:Firebase RecylcerView Adapter Not Getting Accurate View Position

  

你不应该使用populateViewHolder之外的位置作为值   可能有所不同相反,让你的viewHolder最终并使用   viewHolder.getAdapterPosition()来替换它。