将经过身份验证的Firebase用户添加到Listview

时间:2017-07-21 13:31:10

标签: android listview firebase firebase-realtime-database firebase-authentication

我想将Firebase经过身份验证的用户(在输入正确的用户名和密码后)添加到ListView。为了更好地理解这里是我的应用程序的流程。

Here is the image of first layout when app starts

1-当用户点击“添加患者”按钮时,该应用会重定向到另一项活动,其中必须输入正确的电子邮件和密码

2-成功登录后,应用程序再次打开上一个活动(添加患者活动)并将登录用户添加到ListView。这是添加患者的xml

<TextView
    android:layout_width="match_parent"
    android:layout_height="59dp"
    android:layout_alignParentTop="true"
    android:id="@+id/addpatient"
    android:gravity="center"
    android:drawableLeft="@drawable/ic_add_circle_outline_black_48dp"
    android:drawablePadding="-170dp"
    android:textStyle="bold"
    android:textAppearance="@style/TextAppearance.AppCompat.Large"
    android:text="Add Patient"
    android:layout_marginTop="57dp" />

<View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:layout_below="@+id/addpatient"
    android:background="#000" />

<ListView
    android:id="@+id/listpatient"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:layout_weight="1"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:longClickable="true"
    android:layout_marginTop="119dp"
    android:layout_alignParentBottom="true">
</ListView>

请注意,我不想从Firebase数据库获取用户列表,我使用firebase身份验证而不是firebase数据库。这是添加患者活动的代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_patient);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar1);
    setSupportActionBar(toolbar);

    auth = FirebaseAuth.getInstance();

    addPatient = (TextView)findViewById(R.id.addpatient);
    listPatient = (ListView)findViewById(R.id.listpatient);
    arrayList = new ArrayList<String>();
    if(patient == null)
    {
        Toast.makeText(getApplicationContext(),"No user found",Toast.LENGTH_SHORT).show();
    }
    else
    {
        patient = FirebaseAuth.getInstance().getCurrentUser();
        arrayList.add(String.valueOf(patient));
    }
    adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList);
    listPatient.setAdapter(adapter);
    adapter.notifyDataSetChanged();
    addPatient.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent it = new Intent(AddPatient.this,DoctorPanel_Signin.class);
            startActivity(it);
        }
    });

问题是listview没有显示任何数据。如果我删除IF语句,应用程序崩溃是因为尝试在空指针上引用虚拟方法引用类似的东西。而我想的另一件事是,如果我想添加3个用户,那么firebaseaut.getinstance.getcurrentuser将始终返回1个用户,并将一次又一次地覆盖以前的用户,请同样考虑。

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为您在验证患者对象之前是否patient == null进行验证。因此,换句话说,patient object始终为空。要解决这个问题,您需要更改if语句的逻辑,如下所示:

FirebaseAuth.AuthStateListener authListener = new FirebaseAuth.AuthStateListener() {
    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
        FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
        if (firebaseUser != null) {
            Log.d("TAG", "You are signed in Firebase!");
            arrayList.add(String.valueOf(patient));
        } else {
            Log.d("TAG", "You are signed out from Firebase!");
        }
    }
};

您的数据库应如下所示:

Firebase-root
     |
     --- Users
           |
           --- userUid1
           |      |
           |      --- signedInSuccessfully: false
           |
           --- userUid2
                  |
                  --- signedInSuccessfully: true //changes after signed in successfully