java - 从 Firebase 检索值并显示在 EditText 中

标签 java android firebase arraylist android-edittext

因此,我尝试从我的 Firebase 数据库中检索用户个人资料信息,并将其显示在我的 Android 应用程序上,但它似乎根本不起作用!

这是我尝试过的代码,但根本没有运气!

package com.example.ravneet.bloodhub;

import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.TextView;

import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.database.ChildEventListener; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase;

import java.util.ArrayList;

public class Editprofile extends AppCompatActivity {
    TextView chngpsw;
    EditText name, state, city, bloodgrp, mobileno, email;
    FirebaseUser currentFirebaseUser;
    String id;
    private static final String TAG = "EditProfile";
    ArrayList<String> mylist;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_editprofile);
        mylist  = new ArrayList<String>();
        chngpsw = (TextView) findViewById(R.id.chngpsw);
        currentFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        id = currentFirebaseUser.getUid();
        setTitle("Edit Profile");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        name = (EditText) findViewById(R.id.name);
        state = (EditText) findViewById(R.id.state);
        city = (EditText) findViewById(R.id.city);
        bloodgrp = (EditText) findViewById(R.id.bloodgrp);
        mobileno = (EditText) findViewById(R.id.mobileno);
        email = (EditText) findViewById(R.id.email);
        chngpsw.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(getApplicationContext(), Changepswrd.class);
                startActivity(i);
            }
        });
        readData();
        if(mylist.size() != 0){
            setvalues();
        }
        //Log.d(TAG, "SIZE IS on Create " + mylist.size());
    }

    private void readData() {

        DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Users").child(id);
       // Log.d(TAG, "UserID is " + id);
        ref.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
               fetchdata(dataSnapshot);

            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                fetchdata(dataSnapshot);
            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        Log.d(TAG, "Bottom Size :   " + mylist.size());

    }
    private void fetchdata(DataSnapshot dataSnapshot){
        String value = dataSnapshot.getValue(String.class);
        //Log.d(TAG, "Value is " + value);
        mylist.add(value);
        Log.d(TAG, "Size :   " + mylist.size());
    }
    private void setvalues(){
        bloodgrp.setText(mylist.get(0));
        city.setText(mylist.get(1));
        email.setText(mylist.get(2));
        mobileno.setText(mylist.get(3));
        name.setText(mylist.get(4));
        state.setText(mylist.get(5));
    } }

当我尝试在 oncreate 方法中打印 arraylist 的大小时,它显示 0 这是它在 logcat 中显示的内容

> D/EditProfile: UserID is MkfeHsMuJyaNr5Be8R7eRojHngE2 09-24
> D/EditProfile: Bottom Size :   0 
> D/EditProfile: Size :   1
> D/EditProfile: Size :   2 
> D/EditProfile: Size :   3
> D/EditProfile: Size :   4 
> D/EditProfile: Size :   5
> D/EditProfile: Size :   6

Here is Firebase Database

这是 Firebase 数据库

最佳答案

您似乎误解了 Firebase 是异步的。

<小时/>

您需要移动这些行。

setvalues(); 

Log.d(TAG, "Bottom Size :   " + mylist.size());

在这里。

 ref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
           fetchdata(dataSnapshot);
           Log.d(TAG, "Bottom Size :   " + mylist.size());
           setvalues();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            fetchdata(dataSnapshot);
            Log.d(TAG, "Bottom Size :   " + mylist.size()); 
            setvalues();
        }

但是,您的快照中的 fetchdata() 似乎在数据中“太靠下”了。您希望作为一个用户获取整个快照,而不是将每个字符串挑选到列表中。

我建议你使用 POJO 而不是列表来存储 User 类数据

<小时/>

例如,如果您想要所有用户,则可以在 Users 键处设置引用,然后 DataSnapshot 是每个 User 值,而不是其中的数据。

final FirebaseDatabase database = FirebaseDatabase.getInstance();

// Here not just getting one ID
DatabaseReference ref = database.getReference().child("Users");

// Attach a listener to read the data at the Users reference
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        User user = dataSnapshot.getValue(User.class);
        // userList.add(user);  // for example
    }

使用database.getReference().child("Users").child(id);也可能适用于此模式。

关于java - 从 Firebase 检索值并显示在 EditText 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46384584/

相关文章:

java - Android 媒体编解码器 : How long does it take to decode and display one video frame

android - 如何以编程方式使图像角变圆

javascript - 身份验证的架构和思考

ios - iOS 应用程序的 Firebase 3.7.0 上的链接错误

java - 如何使用java剪切图像的一部分而不改变DPI

java - IntelliJ IDEA IDE 搜索文件时弹出<Empty string>

android - 如何禁用 Android 日历(应用程序)的选择字段?

ios - 适用于 IOS 的 Flutter 应用程序,是否可以在不使用 Xcode 的情况下设置 IOS "Legacy Build System"?

java - 打开连接时出现 UCanAccess 异常 - 引用的列上不存在 UNIQUE 约束

java - ArrayList<> 与 ArrayList<Integer>