notifyDataSetChange() Is not working in adapter

Viewed 111

I'm working with Android's new RecyclerView but I can't get my custom adapter to refresh whenever I call one of the "notify" methods.

I've tried calling notifyDataSetChanged, notifyItemRangeInserted and notifyItemInserted and none of them seem to work.

i am getting list size is correct but recycleview only set 10 item when i scroll the page api is called.upadted list size is 20 but not display other 10 items.i want to display all item in list please help me....

this is my adapter :

public class NotificationAdapter extends RecyclerView.Adapter<NotificationAdapter.ViewHolder> {

Context context;
List<NotificationDataItem> mData;


public NotificationAdapter(Context context, List<NotificationDataItem> mData) {
    this.context=context;
    this.mData=mData;
}


@NotNull
@Override
public NotificationAdapter.ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {
    AdapterNotificationBinding adapterNotificationBinding = DataBindingUtil.inflate(
            LayoutInflater.from(parent.getContext()), R.layout.adapter_notification,
            parent, false);
    return new NotificationAdapter.ViewHolder(adapterNotificationBinding);

}

@Override
public void onBindViewHolder(@NotNull NotificationAdapter.ViewHolder holder, int position) {

    if (mData.get(position).getName()!=null&&!mData.get(position).getName().isEmpty()){
        holder.binding.tvUserNotification.setText(mData.get(position).getName());
    }
    if (mData.get(position).getBody()!=null&&!mData.get(position).getBody().isEmpty()){
        holder.binding.tvUserNotificationBody.setText(mData.get(position).getBody());
    }
    if (mData.get(position).getCreatedAt()!=null&&!mData.get(position).getCreatedAt().isEmpty()){
        holder.binding.tvTime.setText(mData.get(position).getCreatedAt());
    }
    if (mData.get(position).getAvatar()!=null){
        Glide.with(context)
                .load(mData.get(position).getAvatar())
                .circleCrop()
                .placeholder(R.drawable.ic_white_speaker)
                .error(R.drawable.ic_white_speaker)
                .into(holder.binding.ivUser);
    }
    /*type => 0 = comment, 1 = like, 2 = unlike, 3 = comment reply

   */
    if (mData.get(position).getType()!=null){
        switch (mData.get(position).getType()) {
            case "0":case "3":
                holder.binding.ivEditProfileImage.setColorFilter(ContextCompat.getColor(context, R.color.colorgray), android.graphics.PorterDuff.Mode.SRC_IN);
                holder.binding.ivEditProfileImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_comment_filled));
                break;
            case "1":
                holder.binding.ivEditProfileImage.setColorFilter(ContextCompat.getColor(context, R.color.colorgray), android.graphics.PorterDuff.Mode.SRC_IN);
                holder.binding.ivEditProfileImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_like_filled));

                break;
            case "2":
                holder.binding.ivEditProfileImage.setRotation(180);
                holder.binding.ivEditProfileImage.setColorFilter(ContextCompat.getColor(context, R.color.colorgray), android.graphics.PorterDuff.Mode.SRC_IN);
                holder.binding.ivEditProfileImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_like_filled));
                break;
            /*case "3":
                holder.binding.ivEditProfileImage.setColorFilter(ContextCompat.getColor(context, R.color.colorgray), android.graphics.PorterDuff.Mode.SRC_IN);
                holder.binding.ivEditProfileImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_comment_filled));
                break;*/
        }

    }


    holder.binding.llNotification.setOnClickListener(v->{
        Intent intent = new Intent(context, PostDetailsActivity.class);
        intent.putExtra("postId", mData.get(position).getPostId());
        context.startActivity(intent);
    });

    holder.binding.ivUser.setOnClickListener(v->{
        Intent intent = new Intent(context, OtherUserProfileActivity.class);
        intent.putExtra("userId", mData.get(position).getUserId());
        context.startActivity(intent);
    });
}


@Override
public int getItemCount() {
    return mData.size();
}
public void updateList(List<NotificationDataItem> mNotification) {
    this.mData.addAll(mNotification);
    Log.d("updateList", "updateList:"+mData.size());
    notifyDataSetChanged();
    Log.d("updateList123", "updateList123:"+mData.size());
}


public static class ViewHolder extends RecyclerView.ViewHolder {
    AdapterNotificationBinding binding;

    public ViewHolder(AdapterNotificationBinding binding) {
        super(binding.getRoot());
        this.binding = binding;
    }
}

}

this is how i attach:

  adapter = new NotificationAdapter(  getActivity(),response.body().getData().getData() );
                                    
                                        if (page == 1) {
                                            binding.rvNotification.setAdapter(adapter);
                                        } else {
                                            adapter.updateList(response.body().getData().getData());
        
                                        }
2 Answers

i got the solution when page 2 is called i initialized new adapter so i get the same data in recyclerview so i try this:

  if (page == 1) {
 adapter =new NotificationAdapter(getActivity(),response.body().getData().getData());
                                    binding.rvNotification.setAdapter(adapter);
                                } else {
                                    adapter.updateList(response.body().getData().getData());

                                }

you are creating new adapter instance every time instead of updating already created and attached to RecyclerView. move your creation code into if for creating and attaching adapter only once, then in else you can update it (same reference, same object)

if (page == 1) {
    adapter = new NotificationAdapter(getActivity(), response.body().getData().getData());
    binding.rvNotification.setAdapter(adapter);
} else {
    adapter.updateList(response.body().getData().getData());
}

another approach would be to create new adapter every time but then you also must call setAdapter(adapter); (new one). updating already existing one is better approach

Related