简体   繁体   中英

notifyItemInserted() is having same effect on list as notifyDataSetChanged() when I only want last item in list updated

The problem that I am having is that when a user adds a comment the entire list refreshes because I have notifyDataSetChanged(); set on the CommentAdapter . Everything jumps, and refreshes and I want it to be smoother, so I decided to use notifyItemInserted(); instead of notifyDataSetChanged(); , but it isn't doing anything different.

notifyItemInserted(); should only update the last item or the newest item added to the list, so why is everything being refreshed/updated...?

Can someone tell me how to fix this? Only want last item added to list to be "added"/"updated"/whatever, not the entire list because if many people start commenting everything is always reloading...

In my readComments(); what I have now is mCommentAdapter.notifyItemInserted(mCommentList.size() - 1); , and what I had before was mCommentAdapter.notifyDataSetChanged(); , but they are having the same effect. How can I fix this?

CommentsActivity

public class CommentsActivity extends AppCompatActivity {

    private CommentAdapter mCommentAdapter;
    private List<Comment> mCommentList;
    private RecyclerView mRecyclerView;

    EditText mAddComment;
    ImageView mImageProfile;
    TextView mPost;

    String mPostId;
    String mPublisherId;
    String mNotificationId;

    FirebaseUser mFirebaseUser;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_comments);

        mRecyclerView = findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(linearLayoutManager);
        mCommentList = new ArrayList<>();
        mCommentAdapter = new CommentAdapter(this, mCommentList, mPostId);
        mRecyclerView.setAdapter(mCommentAdapter);

        mAddComment = findViewById(R.id.add_comment);
        mImageProfile = findViewById(R.id.image_profile);
        mPost = findViewById(R.id.post_comment);

        mFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();

        mPost.setOnClickListener(v -> {
            if (mAddComment.getText().toString().equals("")) {
                Toast.makeText(CommentsActivity.this, "Can't send empty comments", Toast.LENGTH_SHORT).show();
            } else {
                addCommentNotification(mPublisherId, mPostId);
            }
        });

        getImage();
        readComments();
    }

    private void getImage() {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(mFirebaseUser.getUid());
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                User user = dataSnapshot.getValue(User.class);
                if (user != null)
                    Glide.with(getApplicationContext()).load(user.getImageurl()).into(mImageProfile);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    private void readComments() {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Comments").child(mPostId);
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mCommentList.clear();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    Comment comment = snapshot.getValue(Comment.class);
                    mCommentList.add(comment);
                }

                mCommentAdapter = new CommentAdapter(CommentsActivity.this, mCommentList, mPostId);
                mRecyclerView.setAdapter(mCommentAdapter);
                mCommentAdapter.notifyItemInserted(mCommentList.size() - 1);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
}

I am guessing you should be using a ChildEventListener :

Your readComments() must be like this:

private void readComments() {

//your reference
DatabaseReference ref =  FirebaseDatabase.getInstance().getReference("Comments").child(mPostId);


//the child listener

ChildEventListener listener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {

// A new comment has been added
Comment comment = dataSnapshot.getValue(Comment.class);
mCommentList.add(comment);

//Notify adapter
mCommentAdapter.notifyItemInserted(mCommentList.size() - 1);
}

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

}

@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {

}

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


}

@Override
public void onCancelled(DatabaseError databaseError) {

}
};

//attach the listener
ref.addChildEventListener(listener);


}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM