简体   繁体   English

RecyclerView 在我的应用程序中多次显示相同的项目

[英]RecyclerView shows the same item many times in my app

I've created a match system in my Android program that also includes a chat section which has 2 fragments.我在我的 Android 程序中创建了一个匹配系统,该系统还包括一个包含 2 个片段的聊天部分。 The first fragment shows your chats, the second one shows your matches by using RecyclerView and UsersAdapter .第一个片段显示您的聊天记录,第二个片段使用RecyclerViewUsersAdapter显示您的匹配项。 However, in the second (match) fragment, people who you matched with are shown many times.但是,在第二个(匹配)片段中,您匹配的人被多次显示。 For example, the same person is seen many times as you can see here .例如,您可以在此处看到同一个人多次出现。

My code is below.我的代码如下。

UserFragment:用户片段:

    public class UsersFragment extends Fragment {

    private RecyclerView recyclerView;
    private UsersAdapter usersAdapter;
    private List<User> mUsers;

    FirebaseFirestore usersfragmentstore;
    FirebaseAuth readauth;
    DocumentReference readref;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        usersfragmentstore = FirebaseFirestore.getInstance();
        readauth = FirebaseAuth.getInstance();
        View view = inflater.inflate(R.layout.fragment_users, container, false);

        readref = usersfragmentstore.collection("users").document(readauth.getCurrentUser().getUid());
        recyclerView = view.findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        mUsers = new ArrayList<>();

        final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("users");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

                        readref.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                            @Override
                            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                                DocumentSnapshot shot = task.getResult();
                                List<String> matchedid2 = new ArrayList<>();
                                matchedid2 = (List<String>) shot.get("matchlist");


                                if (matchedid2.contains(snapshot.getKey())) {

                                    User user = snapshot.getValue(User.class);
                                    mUsers.add(user);
                                    usersAdapter = new UsersAdapter(getContext(), mUsers, false);
                                    recyclerView.setAdapter(usersAdapter);

                                }



                             }
                        });

                }
            }

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

            }
        });

        return view;

    }

}

UserAdapter:用户适配器:

    public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.ViewHolder> {
    private Context mContext;
    private List<User> mUsers;
    private boolean ischat;

    String theLastMessage;

    public UsersAdapter(Context mContext, List<User> mUsers, boolean ischat) {
        this.mUsers = mUsers;
        this.mContext = mContext;
        this.ischat = ischat;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(mContext).inflate(R.layout.user_item_chat, parent, false);
        return new UsersAdapter.ViewHolder(view);


    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        User user = mUsers.get(position);
        holder.username.setText(user.getName());
        if (user.getImageURL().equals("default")) {
            holder.profile_image.setImageResource(R.drawable.profilepicture);
        } else {
            Glide.with(mContext).load(user.getImageURL()).into(holder.profile_image);
        }

        if (ischat) {
            lastMessage(user.getId(), holder.last_msg);
        } else {
            holder.last_msg.setVisibility(View.GONE);
        }

        if (ischat) {
            if (user.getStatus().equals("online")) {
                holder.img_on.setVisibility(View.VISIBLE);
                holder.img_off.setVisibility(View.GONE);
            } else {
                holder.img_on.setVisibility(View.GONE);
                holder.img_off.setVisibility(View.VISIBLE);
            }
        } else {
            holder.img_on.setVisibility(View.GONE);
            holder.img_off.setVisibility(View.GONE);
        }

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, MessageActivity.class);
                intent.putExtra("userid", user.getId());
                mContext.startActivity(intent);
            }
        });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView username;
        public ImageView profile_image;
        private ImageView img_on;
        private ImageView img_off;
        private TextView last_msg;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            username = itemView.findViewById(R.id.chatusername);
            profile_image = itemView.findViewById(R.id.profile_image);
            img_on = itemView.findViewById(R.id.img_on);
            img_off = itemView.findViewById(R.id.img_off);
            last_msg = itemView.findViewById(R.id.last_msg);
        }
    }

    private void lastMessage(final String userid, final TextView last_msg) {
        theLastMessage = "defalut";
        final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Chats");

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    Chat chat = snapshot.getValue(Chat.class);
                    if (firebaseUser != null && chat != null) {
                        if (chat.getReceiver().equals(firebaseUser.getUid()) && chat.getSender().equals(userid) || chat.getReceiver().equals(userid) && chat.getSender().equals(firebaseUser.getUid())) {
                            theLastMessage = chat.getMessage();
                        }
                    }
                }
                switch (theLastMessage) {
                    case "default":
                        last_msg.setText("No message");
                        break;

                    default:
                        last_msg.setText(theLastMessage);
                        break;
                }
                theLastMessage = "default";
            }

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

            }
        });
    }
}

What am I missing?我错过了什么?

befor adding new data first clear list by mUsers.clear();在添加新数据之前,首先通过mUsers.clear(); as below如下

   public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

                        readref.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                            @Override
                            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                                DocumentSnapshot shot = task.getResult();
                                List<String> matchedid2 = new ArrayList<>();
                                matchedid2 = (List<String>) shot.get("matchlist");


                                if (matchedid2.contains(snapshot.getKey())) {
                                     mUsers.clear();
                                    User user = snapshot.getValue(User.class);
                                    mUsers.add(user);
                                    usersAdapter = new UsersAdapter(getContext(), mUsers, false);
                                    recyclerView.setAdapter(usersAdapter);

                                }



                             }
                        });

                }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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