【发布时间】:2019-01-03 00:26:20
【问题描述】:
我正在尝试从 Firebase 数据库中检索数据。顶层节点是消息,子节点是作者和消息。登录后,从数据库中提取聊天消息。 ChatActivity 调用ChatListAdapter
使用以下代码:-
mAdapter = new ChatListAdapter(this, mDatabaseReference);
mChatListView.setAdapter(mAdapter);
这里的mChatListView 是RecyclerView。适配器代码如下:-
public class ChatListAdapter extends RecyclerView.Adapter<ChatListAdapter.ViewHolder> {
private Activity mActivity;
private DatabaseReference mDatabaseReference;
private ArrayList<DataSnapshot> mSnapshotList;
private ChildEventListener mListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
mSnapshotList.add(dataSnapshot);
notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
public class ViewHolder extends RecyclerView.ViewHolder {
TextView authorName, body;
public ViewHolder(View view) {
super(view);
authorName = (TextView) itemView.findViewById(R.id.author);
body = (TextView) itemView.findViewById(R.id.message);
}
}
public ChatListAdapter(Activity activity, DatabaseReference ref) {
this.mActivity = activity;
this.mDatabaseReference = ref.child("messages");
mDatabaseReference.addChildEventListener(mListener);
mSnapshotList = new ArrayList<>();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.chat_row, parent, false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
InstantMessage message = getItem(position);
String author = message.getAuthor();
holder.authorName.setText(author);
String msg = message.getMessage();
holder.body.setText(msg);
}
public InstantMessage getItem(int i) {
DataSnapshot snapshot = mSnapshotList.get(i);
return snapshot.getValue(InstantMessage.class);
}
@Override
public int getItemCount() {
return mSnapshotList.size();
}
}
ChatActivity如下:-
public class ChatActivity extends AppCompatActivity {
private RecyclerView mChatListView;
private DatabaseReference mDatabaseReference;
private ChatListAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_chat);
mDatabaseReference = FirebaseDatabase.getInstance().getReference();
mChatListView = (RecyclerView) findViewById(R.id.chat_list_view);
}
@Override
public void onStart(){
super.onStart();
mAdapter = new ChatListAdapter(this, mDatabaseReference);
mChatListView.setAdapter(mAdapter);
}
@Override
public void onStop() {
super.onStop();
mAdapter.cleanUp();
}
}
【问题讨论】:
-
请发布您的完整代码,包括您的活动。
-
@RajshreeTiwari 包含活动的完整代码已添加。
-
在 onChild 中添加这一行
mSnapshotList = new ArrayList<>();在mSnapshotList.add(dataSnapshot);之前添加 -
@PeterHaddad 该行已存在于 ChatListAdapter 构造函数中。
标签: android firebase firebase-realtime-database android-recyclerview