有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

RecyclerView的java onBindview持有者没有担任第二个职位,但我在getItemCount中有第三个职位

Iam从firebase获取数据,并将其填充到userMessageList.adapter中,收到通知,getItemCount显示正确的计数,但onBindViewHolder仅在userMessage列表的第一个位置运行一次onBindViewHolder无法继续工作positions or data

我的问题没有解决办法

THIS IS MY ADAPTER CLASS

public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MessageViewHolder> {

    private List <Messages> userMessagesList;
    private DatabaseReference firebaseDatabase,users;
    private FirebaseAuth auth;

    public MessageAdapter(List<Messages> userMessagesList){

        this.userMessagesList = userMessagesList;
    }


    @NonNull
    @Override
    public MessageViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.custom_messages_layout,viewGroup,false);

        auth = FirebaseAuth.getInstance();

        return new MessageViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final MessageViewHolder messageViewHolder, int i) {



        String messageSenderID = auth.getCurrentUser().getUid();
        Messages messages = userMessagesList.get(i);

        String fromUserID = messages.getFrom();
        String fromMessageType = messages.getType();

        users = FirebaseDatabase.getInstance().getReference().child("Users").child(fromUserID);

        users.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                if(dataSnapshot.hasChild("image")){

                    final String receiverImage = dataSnapshot.child("image").getValue().toString();

                    Picasso.get()
                            .load(receiverImage)
                            .placeholder(R.drawable.profile_image)
                            .into(messageViewHolder.receiverProfileImage);


                }
            }

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

            }
        });

        if(fromMessageType.equals("text")){

            messageViewHolder.receiverMessageText.setVisibility(View.INVISIBLE);
            messageViewHolder.receiverProfileImage.setVisibility(View.INVISIBLE);

            if(fromUserID.equals(messageSenderID)){

                messageViewHolder.senderMessageText.setBackgroundResource(R.drawable.sender_messages_layout);
                messageViewHolder.senderMessageText.setTextColor(Color.BLACK);
                messageViewHolder.senderMessageText.setText(messages.getMessage());
            }
            else{

                messageViewHolder.receiverMessageText.setVisibility(View.INVISIBLE);
                messageViewHolder.receiverProfileImage.setVisibility(View.VISIBLE);
                messageViewHolder.receiverMessageText.setVisibility(View.VISIBLE);

                messageViewHolder.receiverMessageText.setBackgroundResource(R.drawable.receiver_messeges_layout);
                messageViewHolder.receiverMessageText.setTextColor(Color.BLACK);
                messageViewHolder.receiverMessageText.setText(messages.getMessage());


            }
        }

    }

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


    public class MessageViewHolder extends RecyclerView.ViewHolder{

        public TextView senderMessageText, receiverMessageText;

        public CircleImageView receiverProfileImage;


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

            senderMessageText =itemView.findViewById(R.id.sender_message_text);
            receiverMessageText = itemView.findViewById(R.id.receiver_message_text);
            receiverProfileImage =itemView.findViewById(R.id.message_profile_image);

        }
    }
}

THIS IS ACTIVITY CODE WHERE IAM POPULATING THE userMessageList

rootRef.child("Messages")
                .child(messageSenderID).
                child(messageReceivedID)
                .addChildEventListener(new ChildEventListener() {
                 @Override
                 public void onChildAdded(@NonNull DataSnapshot 
                 dataSnapshot, @Nullable String s) {

                 Messages messages =  dataSnapshot.getValue(Messages.class);
                        messagesList.add(messages);
                        messageAdapter.notifyDataSetChanged();

                    }

    }

共 (1) 个答案

  1. # 1 楼答案

    正如Pemba Tamang在上面的评论中正确地说的,您的适配器中不应该有任何网络或数据库相关代码

    解决问题的算法: 1.获取适配器外部的消息列表。 2.订阅适配器外部的子项更改。 3.当子项更改时,转到查看模型,根据其id查找此消息并更新此信息。 4.更新适配器

    如果你用DiffUtils更新你的适配器也会很好。它将只绑定已更改的子项,而不是所有子项。见:https://developer.android.com/reference/android/support/v7/util/DiffUtil