【问题标题】:firebase data not shown before pressing back button in RecyclerView在 RecyclerView 中按下后退按钮之前未显示 firebase 数据
【发布时间】:2018-04-09 23:32:05
【问题描述】:

我正在使用 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);



}


}

【问题讨论】:

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


    【解决方案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()
        }
    

    【讨论】:

    • 嘿!虽然我在它没有工作之前尝试过它,因为我在课堂上宣布了recyclerview并使其成为最终的..但是在你再次指出之后我只是在全球范围内宣布它然后它就像一个魅力..哈哈..谢谢你..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    相关资源
    最近更新 更多