【发布时间】:2018-11-17 04:55:00
【问题描述】:
我最近创建了一个仍在开发中的应用程序。 需要您的帮助,因为每当我从 firebase 数据库中获取数据时,我都会多次获得单个数据。看看我的代码,数据库,你可以正确地得到我的问题,你也会得到我想说的。
我的代码:
public class FragmentChat extends Fragment
{
EditText mMsgInput;
Button mSend;
LinearLayout mMsgContainerTv;
ScrollView mMsgContainer;
ProgressDialog mProgressDialog;
String name, email, image;
FirebaseAuth mAuth;
DatabaseReference mDataRef, mChatroomRef, mMessageRef;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
super.onCreateView(inflater, container, savedInstanceState);
View chat = inflater.inflate(R.layout.fragment_chat, container, false);
mMsgInput = (EditText) chat.findViewById(R.id.fragment_chatETMsg);
mSend = (Button) chat.findViewById(R.id.fragment_chatBTSend);
mMsgContainerTv = (LinearLayout) chat.findViewById(R.id.fragment_chatLLMsgContainer);
mMsgContainer = (ScrollView) chat.findViewById(R.id.fragment_chatSVMsgContainer);
mAuth = FirebaseAuth.getInstance();
mDataRef = FirebaseDatabase.getInstance().getReference();
mChatroomRef = FirebaseDatabase.getInstance().getReference().child("Chatroom");
if(mAuth.getCurrentUser() == null){
Toast.makeText(getActivity(), "Please Login First", Toast.LENGTH_SHORT).show();
}else{
mProgressDialog = new ProgressDialog(getActivity());
mProgressDialog.setTitle("Loading data...");
mProgressDialog.setMessage("Please wait while we load your data into activity...");
mProgressDialog.setCanceledOnTouchOutside(false);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.show();
mDataRef.child("Users").child(mAuth.getCurrentUser().getUid()).addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
name = dataSnapshot.child("name").getValue().toString();
email = dataSnapshot.child("email").getValue().toString();
image = dataSnapshot.child("image").getValue().toString();
mProgressDialog.dismiss();
}
@Override
public void onCancelled(DatabaseError p1)
{
mProgressDialog.dismiss();
}
});
sendmsg();
}
return chat;
}
@Override
public void onStart()
{
super.onStart();
if(mAuth.getCurrentUser() != null){
mChatroomRef.addChildEventListener(new ChildEventListener(){
@Override
public void onChildAdded(DataSnapshot data, String s)
{
if(data.exists()){
displayMsg(data);
}
}
@Override
public void onChildChanged(DataSnapshot data, String s)
{
if(data.exists()){
displayMsg(data);
}
}
@Override
public void onChildRemoved(DataSnapshot data)
{
}
@Override
public void onChildMoved(DataSnapshot data, String s)
{
}
@Override
public void onCancelled(DatabaseError ata)
{
}
});
}
}
private void sendmsg()
{
mSend.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v)
{
String msg = mMsgInput.getText().toString();
HashMap<String, Object> mHashmapS = new HashMap<String, Object>();
mChatroomRef.updateChildren(mHashmapS);
String mMessageKey = mChatroomRef.push().getKey();
mMessageRef = mChatroomRef.child(mMessageKey);
HashMap<String, Object> mHashmapMessage = new HashMap<String, Object>();
mHashmapMessage.put("name", name);
mHashmapMessage.put("msg", msg);
mMessageRef.updateChildren(mHashmapMessage);
mMsgInput.setText("");
Toast.makeText(getActivity(), "Message sent successfully...", Toast.LENGTH_SHORT).show();
}
});
}
private void displayMsg(DataSnapshot data)
{
Iterator it = data.getChildren().iterator();
while(it.hasNext()){
String msgMsg = (String) ((DataSnapshot) it.next()).getValue();
String msgName = (String) ((DataSnapshot) it.next()).getValue();
LayoutInflater mInflator = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View mView = mInflator.inflate(R.layout.item_msg, null);
TextView mMsgView = (TextView) mView.findViewById(R.id.item_msgTVMsg);
mMsgView.append(msgName + " :\n" + msgMsg + "\n ");
mMsgContainerTv.addView(mView, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
mMsgContainer.fullScroll(ScrollView.FOCUS_DOWN);
}
}
}
我的数据库结构: 聊天室 >> messagekey >> 1. msg, 2. name
在我的应用程序中,我得到了多次相同的消息和名称
我还希望将数据库结构中的数据以数据库结构的方式放入我的应用程序中。
【问题讨论】:
标签: android android-fragments firebase-realtime-database