java - 向 recyclerView 添加额外数据
问题描述
我最近刚开始学习一些编码,一点python和java。我正在尝试制作一个whatsapp克隆作为测试,但我碰壁了。
基本上,我有一个显示为群聊名称的 UID,我想将其交换为我保存在 firebase 中与 Uid 处于同一级别的 groupId。FirebaseDatabase.getInstance().getReference().child("chat").child(chatId).child("info").child("groupId)
我一直在关注 simcoder youtube 视频,并且在用户和聊天 UID 之间发生了很多制衡,我在这一切中迷失了方向。
我已经尝试将 groupId 添加到适配器和 chatObject 中,并且我可以在调试中看到数据,但我无法让它填充回收器视图。我在这里搜索了论坛,但无法完全正常工作。
我希望有人可以帮助我,非常感谢
private RecyclerView mChatList;
private RecyclerView.Adapter mChatListAdapter;
private RecyclerView.LayoutManager mChatListLayoutManager;
ArrayList<ChatObject> chatList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_group_chat);
OneSignal.startInit(this).init();
OneSignal.setSubscription(true);
OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() {
@Override
public void idsAvailable(String userId, String registrationId) {
FirebaseDatabase.getInstance().getReference().child("user").child(FirebaseAuth.getInstance().getUid()).child("notificationKey").setValue(userId);
}
});
OneSignal.setInFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification);
Button mLogout = findViewById(R.id.logout);
Button mFindUser = findViewById(R.id.finduser);
mFindUser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getApplicationContext(), FindUserActivity.class));
}
});
mLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OneSignal.setSubscription(false);
FirebaseAuth.getInstance().signOut();
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
return;
}
});
getPermissions();
initializeRecyclerView();
getUserChatList();
}
private void getUserChatList(){
DatabaseReference mUserChatDB = FirebaseDatabase.getInstance().getReference().child("user").child(FirebaseAuth.getInstance().getUid()).child("chat");
mUserChatDB.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
for (DataSnapshot childSnapshot : dataSnapshot.getChildren()){
ChatObject mChat = new ChatObject(childSnapshot.getKey());
boolean exists = false;
for (ChatObject mChatIterator : chatList){
if(mChatIterator.getChatId().equals(mChat.getChatId()))
exists = true;
}
if (exists)
continue;
chatList.add(mChat);
getChatData(mChat.getChatId());
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void getChatData(String chatId) {
DatabaseReference mChatDB = FirebaseDatabase.getInstance().getReference().child("chat").child(chatId).child("info");
mChatDB.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
String chatId = "";
if(dataSnapshot.child("id").getValue() != null)
chatId = dataSnapshot.child("id").getValue().toString();
for(DataSnapshot userSnapshot : dataSnapshot.child("users").getChildren()){
for(ChatObject mChat : chatList)
if(mChat.getChatId().equals(chatId)){
UserObject mUser = new UserObject(userSnapshot.getKey());
mChat.addUserToArrayList(mUser);
getUserData(mUser);
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void getUserData(UserObject mUser) {
DatabaseReference mUserDb = FirebaseDatabase.getInstance().getReference().child("user").child(mUser.getUid());
mUserDb.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
UserObject mUser = new UserObject(dataSnapshot.getKey());
if(dataSnapshot.child("notificationKey").getValue() != null)
mUser.setNotificationKey(dataSnapshot.child("notificationKey").getValue().toString());
for(ChatObject mChat : chatList)
for(UserObject mUserIt : mChat.getUserObjectArrayList()){
if(mUserIt.getUid().equals(mUser.getUid())){
mUserIt.setNotificationKey(mUser.getNotificationKey());
}
}
mChatListAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void initializeRecyclerView() {
chatList = new ArrayList<>();
mChatList = findViewById(R.id.chatList);
mChatList.setNestedScrollingEnabled(false);
mChatList.setHasFixedSize(false);
mChatListLayoutManager = new LinearLayoutManager(getApplicationContext(), RecyclerView.VERTICAL,false);
mChatList.setLayoutManager(mChatListLayoutManager);
mChatListAdapter = new ChatListAdapter(chatList);
mChatList.setAdapter(mChatListAdapter);
}
解决方案
从我看到的情况来看,您正在向适配器传递一个空列表,这就是为什么没有要显示的数据的原因。而且,在您使用的地方mChatListAdapter.notifyDataSetChanged();
,您不会在填充列表之前设置适配器。
我不确定您要显示哪些数据,但您必须从 firebase 的列表中收集您要显示的所有信息,例如,如果UserObject
是您想要的,您必须创建一个ArrayList<UserObject>
, 以添加到那里所有对象,将其传递给适配器,然后调用adapter.notifyDataSetChanged()
.
您可以在适配器中创建功能,例如:
public void setData(ArrayList<YourObject> list){
yourAdapterList = list
this.notifyDataSetChanged()
}
然后从你的活动/片段中调用它adapter.setData( /* your populated list */)
推荐阅读
- r - 如何创建机票数据透视表?
- python - 用循环访问数据库中的记录替换关键字
- eclipse - Team Foundation Server - Eclipse 和跨平台:无法在 Eclipse 中使用 TEE 克隆 Git 存储库。错误克隆 - 未授权
- reactjs - 如何合并状态和道具以控制 React 中警报的可见性
- python - Tensorflow skylake-avx512 从源代码编译缺少 __cpu_model 符号
- ios - 如何删除视图控制器堆栈并仅显示一个视图控制器
- c - 使用 strcpy 或 memcpy 连接字符串
- linux - 在 ubuntu 中安装 libpulse-dev 包时出错
- vuetify.js - 我部署的 NuxtJs 站点的 CSS 无法正常工作
- c# - 对象属性 Null/Empty 检查