Muhammad Saad
Muhammad Saad

Reputation: 733

Update RecyclerView onChildChanged Firebase

I'm trying to update my recyclerview but i'm getting error of

java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1

mDatabase.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                Upload upload = dataSnapshot.getValue(Upload.class);
                uploads.add(upload);
                adapter = new MyAdapter(MainActivity.this, uploads);
                recyclerView.setAdapter(adapter);
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

          //      uploads.clear();
                String key=dataSnapshot.getKey();
                Upload upload = dataSnapshot.getValue(Upload.class);
                uploads.set(uploads.indexOf(key),upload);
                adapter.notifyDataSetChanged();


            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

Help me with this logic. If i didn't do anything in onChildChanged except Notify then it will create duplicate child

Upvotes: 3

Views: 855

Answers (1)

DragonFire
DragonFire

Reputation: 4082

Ok I Got it

You will need two arrays to do this.

// Lists
private final List<ChatModel> lIndividualChats = new ArrayList<>();
private ArrayList<String> mKeys = new ArrayList<>();

Then

public void onChildAdded(@NonNull DataSnapshot dataSnapshot,
                        @Nullable String s) {

   ChatModel chatModel = dataSnapshot.getValue(ChatModel.class);
   lIndividualChats.add(chatModel);
   chatsAdapter.notifyDataSetChanged();

   String key = dataSnapshot.getKey();
   mKeys.add(key);

}

@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot,
                          @Nullable String s) {

   ChatModel chatModel = dataSnapshot.getValue(ChatModel.class);
   String key = dataSnapshot.getKey();

   int index = mKeys.indexOf(key);
   lIndividualChats.set(index,
                        chatModel);
   chatsAdapter.notifyDataSetChanged();

}

By using another array of simple string type you will be able to access the index of the model array list.

Upvotes: 1

Related Questions