0

The problem is that in my tablayout when im switching between tabs my list duplicating. So i need to remove list on onStop() to recreate it then. Or might be other better solution.

I have tried the following solutions https://code-examples.net/en/q/1c97047

How to reset recyclerView position item views to original state after refreshing adapter

Remove all items from RecyclerView

My code of adapter

public class OnlineUsersAdapter extends RecyclerView.Adapter<OnlineUsersAdapter.OnlineUserViewHolder> {

private List<OnlineUser> onlineUsers = new ArrayList<>();
private OnItemClickListener.OnItemClickCallback onItemClickCallback;
private OnItemClickListener.OnItemClickCallback onChatClickCallback;
private OnItemClickListener.OnItemClickCallback onLikeClickCallback;
private Context context;

public OnlineUsersAdapter(Context context) {
    this.onlineUsers = new ArrayList<>();
    this.context = context;
}

@NonNull
@Override
public OnlineUsersAdapter.OnlineUserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    context = parent.getContext();
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_user, parent, false);
    return new OnlineUsersAdapter.OnlineUserViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull OnlineUsersAdapter.OnlineUserViewHolder holder, int position) {
    OnlineUser user = onlineUsers.get(position);
    Log.d("testList", "rating " + user.getRating() + " uid " + user.getUid());
    holder.bind(user, position);
}

@Override
public int getItemCount() {
    return onlineUsers.size();
}

class OnlineUserViewHolder extends RecyclerView.ViewHolder {
    RelativeLayout container;
    ImageView imageView, likeBtn, chatBtn;
    TextView name, country;

    private LottieAnimationView animationView;

    OnlineUserViewHolder(View itemView) {
        super(itemView);
        context = itemView.getContext();
        container = itemView.findViewById(R.id.item_user_container);
        imageView = itemView.findViewById(R.id.user_img);
        likeBtn = itemView.findViewById(R.id.search_btn_like);
        chatBtn = itemView.findViewById(R.id.search_btn_chat);
        name = itemView.findViewById(R.id.user_name);
        country = itemView.findViewById(R.id.user_country);
        animationView = itemView.findViewById(R.id.lottieAnimationView);
    }

    void bind(OnlineUser user, int position) {
        ViewCompat.setTransitionName(imageView, user.getName());

        if (FirebaseUtils.isUserExist() && user.getUid() != null) {
            new FriendRepository().isLiked(user.getUid(), flag -> {
                if (flag) {
                    likeBtn.setBackground(ContextCompat.getDrawable(context, R.drawable.ic_favorite));
                    animationView.setVisibility(View.VISIBLE);
                } else {
                    likeBtn.setBackground(ContextCompat.getDrawable(context, R.drawable.heart_outline));
                    animationView.setVisibility(View.GONE);
                }
            });
        }

        if (user.getUid() != null) {
            chatBtn.setOnClickListener(new OnItemClickListener(position, onChatClickCallback));
            likeBtn.setOnClickListener(new OnItemClickListener(position, onLikeClickCallback));
        }

        imageView.setOnClickListener(new OnItemClickListener(position, onItemClickCallback));
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);

        if (user.getImage().equals(Consts.DEFAULT)) {
            Glide.with(context).load(context.getResources().getDrawable(R.drawable.default_avatar)).into(imageView);
        } else {
            Glide.with(context).load(user.getImage()).thumbnail(0.5f).into(imageView);
        }

        country.setText(user.getCountry());

        ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f).setDuration(500);
        animator.addUpdateListener(valueAnimator ->
                animationView.setProgress((Float) valueAnimator.getAnimatedValue()));

        if (animationView.getProgress() == 0f) {
            animator.start();
        } else {
            animationView.setProgress(0f);
        }
    }
}


public OnlineUsersAdapter(OnItemClickListener.OnItemClickCallback onItemClickCallback,
                          OnItemClickListener.OnItemClickCallback onChatClickCallback,
                          OnItemClickListener.OnItemClickCallback onLikeClickCallback) {
    this.onItemClickCallback = onItemClickCallback;
    this.onChatClickCallback = onChatClickCallback;
    this.onLikeClickCallback = onLikeClickCallback;
}

public void addUsers(List<OnlineUser> userList) {
    int initSize = userList.size();
    onlineUsers.addAll(userList);
//        notifyItemRangeInserted(onlineUsers.size() - userList.size(), onlineUsers.size());
}

public String getLastItemId() {
    return onlineUsers.get(onlineUsers.size() - 1).getUid();
}

public void clearData() {
    List<OnlineUser> data = new ArrayList<>();
    addUsers(data);
    notifyDataSetChanged();
}

My code in fragment

@Override
public void onStop() {
    super.onStop();
    firstUid = "";
    stopDownloadList = false;
    List<OnlineUser> list = new ArrayList<>();
    mAdapter.addUsers(list);
    mAdapter.notifyDataSetChanged();
}

`users are added after callback

 @Override
public void addUsers(List<OnlineUser> onlineUsers) {
    if (firstUid.equals("")){
        firstUid = onlineUsers.get(0).getUid();
    }

    if (!firstUid.equals("") && onlineUsers.contains(firstUid)){
        stopDownloadList = true;
    }
    if (!stopDownloadList){
        mAdapter.addUsers(onlineUsers);
    }
    setRefreshProgress(false);
    isLoading = false;
    isMaxData = true;
}
Bo Z
  • 2,359
  • 1
  • 13
  • 31

1 Answers1

0

The line mAdapter.addUsers(onlineUsers); from addUsers method gets called twice. Looks like your asynchronous operation gets triggered twice (e. g. from repeating lifecycle methods like onCreate/onCreateView/onViewCreated).

Solution #1: request users a single time

Move your user requesting machinery to onCreate or onAttach. This will save network traffic but could lead to showing outdated data.

Solution #2: replaceUsers

Your clearData calls mAdapter.addUsers(new ArrayList<>()); (btw, take a look at Collections.emptyList()). Looks like you're trying to replace adapter data but appending instead. Replacement method could look like

public void replaceUsers(List<OnlineUser> userList) {
    int oldSize = userList.size();
    onlineUsers = userList;
    notifyItemRangeRemoved(0, oldSize);
    notifyItemRangeInserted(0, userList.size);
}

This version still requeses users every time your fragment gets focused but shows fresher data.

Miha_x64
  • 5,973
  • 1
  • 41
  • 63