【问题标题】:Why the chat list is not appearing?为什么聊天列表没有出现?
【发布时间】:2021-06-01 15:18:47
【问题描述】:

就像社交媒体应用程序,这个片段应该显示聊天列表,但不是,代码如下:

DirectMessagesFragment:

public class DirectMessagesFragment extends Fragment{
FirebaseAuth firebaseAuth;
FirebaseUser currentUser;
AdapterChatlist adapterChatlist;
DatabaseReference ref;
RecyclerView recyclerViewChatter;
List<ModelChatter> chatterList ;
List<ModelChatlist> chatlistList ;

public DirectMessagesFragment(){}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    setHasOptionsMenu(true);

    View view = inflater.inflate(R.layout.fragment_direct_messages, container, false);
    firebaseAuth = FirebaseAuth.getInstance();
    currentUser = FirebaseAuth.getInstance().getCurrentUser();
    recyclerViewChatter = view.findViewById(R.id.chatter_recyclerview);
    chatlistList = new ArrayList<>();

    ref = FirebaseDatabase.getInstance().getReference("Chatlist").child(currentUser.getUid());
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            chatlistList.clear();
            for (DataSnapshot ds:snapshot.getChildren()){
                ModelChatlist chatlist = ds.getValue(ModelChatlist.class);
                chatlistList.add(chatlist);}
            loadChats();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {}
    });
    return view;
}


private void loadChats() {
    chatterList = new ArrayList<>();
    ref = FirebaseDatabase.getInstance().getReference("Users");
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            chatterList.clear();
            for (DataSnapshot ds:snapshot.getChildren()){
                ModelChatter chatter = ds.getValue(ModelChatter.class);
                for(ModelChatlist chatlist: chatlistList){
                    if(chatter.getUid() != null && chatter.getUid().equals(chatlist.getId())){
                        chatterList.add(chatter);
                        break;
                    }}
                adapterChatlist = new AdapterChatlist(getContext(), chatterList);
                recyclerViewChatter.setAdapter(adapterChatlist);
            }}

        @Override
        public void onCancelled(@NonNull DatabaseError error) {}
    });
}}

在 ChatActivity 中:

        //create chat list in firebase
        DatabaseReference ref1 = 
   FirebaseDatabase.getInstance().getReference("ChatList")
                .child(uid).child(hisUid);
        ref1.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if(!snapshot.exists()){
                    ref1.child("id").setValue(hisUid);
                }}

            @Override
            public void onCancelled(@NonNull DatabaseError error) {}
        });
        DatabaseReference ref2 = FirebaseDatabase.getInstance().getReference("ChatList")
                .child(hisUid).child(uid);
        ref2.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if(!snapshot.exists()){
                    ref2.child("id").setValue(uid);
                }}            
            @Override
            public void onCancelled(@NonNull DatabaseError error) {}
        });}

    @Override
    public void afterTextChanged(Editable s) {
    }
};
/////////
}

ModelChatlist 只包含 id。

ModelChatter 包含名称、图像、uid。

AdapterChatlist:

public class AdapterChatlist extends RecyclerView.Adapter<AdapterChatlist.MyHolder>{
Context context;
List<ModelChatter> chattersList;

public AdapterChatlist(Context context, List<ModelChatter> chattersList) {
    this.context = context;
    this.chattersList = chattersList;
}

@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.row_dm, parent, false);
    return new MyHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyHolder holder, int position) {
    String userImage = chattersList.get(position).getImage();
    String userName = chattersList.get(position).getName();
    String hisUid = chattersList.get(position).getUid();


    holder.chatter_name.setText(userName);
    try {
        Picasso.with(context).load(userImage).placeholder(R.drawable.user).into(holder.chatter_img);
    } catch (Exception e){
        Picasso.with(context).load(R.drawable.user).into(holder.chatter_img);

    }

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(context, ChatActivity.class);
            intent.putExtra("hisUid", hisUid);
            context.startActivity(intent);
        }
    });}

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

class MyHolder extends RecyclerView.ViewHolder{

    ImageView chatter_img;
    TextView chatter_name;
    public MyHolder(@NonNull View itemView) {
        super(itemView);
        chatter_img = itemView.findViewById(R.id.chatter_img);
        chatter_name = itemView.findViewById(R.id.chatter_name);
    }}}}

fragment_direct_messages 布局包含recyclerview,row_dm 包含cardview

任何帮助将不胜感激..

【问题讨论】:

  • 如果您遇到问题,最好在发布问题时创建MCVE。您为此问题发布了近 400(四百)行行代码。人们要解析和尝试在线调试的内容很多。请编辑您的问题并隔离问题,这样可以增加获得帮助的机会。

标签: java android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

将聊天列表传递到您的方法中

 for (DataSnapshot ds:snapshot.getChildren()){
                ModelChatlist chatlist = ds.getValue(ModelChatlist.class);
                chatlistList.add(chatlist);
            }
            loadChats(chatlistList);



private void loadChats(List<ModelChatlist> chatlist) {

//your code
}

【讨论】:

  • 没有任何变化,感谢您的尝试
  • 那么您在添加快照中的值后检查了 chatlistList 的大小吗?外部 for 循环@SalmaSaloom
  • 使用 ds.toObject(yourModelClass) 代替 ds.getValue
  • toObject 未定义(红色)
  • 糟糕!看这里(stackoverflow.com/questions/67688456/…) 从数据快照中获取价值。@SalmaSaloom
【解决方案2】:

尝试添加过滤器(例如记录接收到的数据)以检查实际问题仍然存在的位置。这么多的代码很难过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 2015-08-04
    • 2018-08-08
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多