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 楼答案
正如Pemba Tamang在上面的评论中正确地说的,您的适配器中不应该有任何网络或数据库相关代码
解决问题的算法: 1.获取适配器外部的消息列表。 2.订阅适配器外部的子项更改。 3.当子项更改时,转到查看模型,根据其id查找此消息并更新此信息。 4.更新适配器
如果你用DiffUtils更新你的适配器也会很好。它将只绑定已更改的子项,而不是所有子项。见:https://developer.android.com/reference/android/support/v7/util/DiffUtil