【发布时间】: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