在RecyclerView中按回按钮之前未显示firebase数据

时间:2018-04-09 15:04:54

标签: android firebase-realtime-database android-recyclerview

我正在使用firebase实时数据库..我检索数据和一切,但我的主要问题是数据没有显示,除非我按下按钮..我经历了堆栈,它建议notifyDataSetChanged();我以前做过,但仍然没有运气。因为我正在使用GridLayout,我无法在addListeneOnDatachange函数中使用适配器,因为它显示错误,说不允许在那里为我的RecyclerViewAdapter添加适配器。

    package my.unimas.a50200siswa.studentattendancemonitoringsystem;

    import android.content.Intent;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.GridLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.util.Log;
    import android.view.View;
    import android.widget.TextView;

    import com.google.firebase.auth.FirebaseAuth;
    import com.google.firebase.auth.FirebaseUser;
    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 com.google.firebase.database.ValueEventListener;

    import java.util.ArrayList;
    import java.util.List;

public class HomeActivity extends AppCompatActivity {

String userID;
List<CourseModel> listCourse;
TextView btnSignOut, UserName;

/*---- Firebase Database stuff ----*/
FirebaseAuth mAuth;
FirebaseUser user;
FirebaseAuth.AuthStateListener mAuthListener;
DatabaseReference myRef;




@Override
protected void onStart() {

    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);


}


@Override
public void onStop() {
    super.onStop();
    if (mAuthListener != null) {
        mAuth.removeAuthStateListener(mAuthListener);
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    /*-------Finding View---------*/
    btnSignOut = (TextView) findViewById(R.id.btnsignout_home);
    UserName = findViewById(R.id.username);
    RecyclerView myrv = findViewById(R.id.recyclerviewcourse);
    myrv.setLayoutManager(new GridLayoutManager(this,2));
    //  CourseCode();

    btnSignOut.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mAuth.signOut();
        }

    });


    mAuthListener = new FirebaseAuth.AuthStateListener() {

        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            if (firebaseAuth.getCurrentUser() == null) {
                startActivity(new Intent(HomeActivity.this, SignInActivity.class));
            }
        }
    };

    /* ----------------- Firebase Elements -----------------*/
    mAuth = FirebaseAuth.getInstance();
    user = mAuth.getCurrentUser();
    userID = user.getUid();


    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    myRef = rootRef.child("Users");
    /*------------------------------------------------------------------*/


    listCourse = new ArrayList<>();


    myRef.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            String userName = dataSnapshot.child(userID).child("userName").getValue(String.class);
            UserName.setText(userName);
            String coursecode[] = new String[10];
            String coursename[] = new String[10];

            listCourse.clear();
            if (dataSnapshot.exists()) {

                int i = 1;
                for (DataSnapshot dataSnapshot1 : dataSnapshot.child(userID).child("Course").getChildren()) {

                    coursecode[i]= dataSnapshot1.getKey();
                    coursename[i]=dataSnapshot.child(userID).child("Course").child(coursecode[i]).child("CourseName").getValue(String.class);
                    listCourse.add(new CourseModel(userID,coursecode[i],coursename[i]));
                    i++;

                }


            }



        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.w("Hello", "Failed to read value.", error.toException());
        }
    });




    RecyclerViewAdapterCourse myAdapter = new RecyclerViewAdapterCourse(this,listCourse);
    myAdapter.notifyDataSetChanged();
    myrv.setAdapter(myAdapter);



}


}

1 个答案:

答案 0 :(得分:1)

每次数据更改时都需要调用myAdapter.notifyDataSetChanged()。在您的情况下,这意味着您需要在onDataChanged(DataSnapShot dataSnapShot)函数的末尾调用它。

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        String userName = dataSnapshot.child(userID).child("userName").getValue(String.class);
        UserName.setText(userName);
        String coursecode[] = new String[10];
        String coursename[] = new String[10];

        listCourse.clear();
        if (dataSnapshot.exists()) {

            int i = 1;
            for (DataSnapshot dataSnapshot1 : dataSnapshot.child(userID).child("Course").getChildren()) {

                coursecode[i]= dataSnapshot1.getKey();
                coursename[i]=dataSnapshot.child(userID).child("Course").child(coursecode[i]).child("CourseName").getValue(String.class);
                listCourse.add(new CourseModel(userID,coursecode[i],coursename[i]));
                i++;

            }
        }

        myAdapter.notifyDataSetChanged()
    }