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

标签 java android android-recyclerview

我在我的 Android 程序中创建了一个匹配系统,其中还包括一个包含 2 个 fragment 的聊天部分。第一个 fragment 显示您的聊天记录,第二个 fragment 使用 RecyclerViewUsersAdapter 显示您的匹配项。但是,在第二个(匹配) fragment 中,与您匹配的人多次出现。例如,同一个人多次出现,如您所见 here .

我的代码如下。

用户 fragment :

    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;

    }

}

用户适配器:

    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) {

            }
        });
    }
}

我错过了什么?

最佳答案

在添加新数据之前首先通过mUsers.clear();清除列表

   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);

                                }



                             }
                        });

                }

关于java - RecyclerView 在我的应用程序中多次显示相同的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58121221/

相关文章:

java - 在struts 2对话框中显示错误消息?

java - 使用 Java 或 Python 将 8 位(16 色调色板)PNG 转换为适当的 4 位(16 色调色板)?

java - List.of 给出编译错误 "The method of(char, char, char, char, char, char) is undefined for the type List"

具有域名的 Android sdk 2.2 代理不起作用

java - 在 documentSnapShot 中获取值,但将其转换为对象时,对象返回 null,为什么?

php - 通过json在数据库中插入行不起作用

android - 在 Recycler View 中单击项目时获取 TextView 的值?

java - 通过 HTTP POST 上传文件

android - 在 recyclerview 中附加 onClickListener 的最佳位置

android - Activity 中的 float 操作按钮 - 如何锚定到 fragment 中的回收 View ?