Reputation: 733
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
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