ChildEventListener无法正确填充listview

问题描述 投票:0回答:1

我正在尝试与Firebase中的ChildEventListener一起使用每个子节点的“ title”字段填充listView。但是它不能正常工作。我的第一个活动是AuthActivity,其中包含googleSignIn Button,用户可以通过该按钮登录或进行身份验证。之后,在MainActivity中,listView假定使用ChildEventListener datasnapshot填充数据。但它仍然是空白。

有趣的部分是,如果我按下后退按钮回到AuthActivity,然后再次单击登录按钮,它将再次带我进入MainActivity,这一次它以某种方式显示了listView和正确的数据。关闭应用程序后,会发生相同的错误。 我在Logcat中没有收到任何错误

这是我的AuthActivity文件

    public class AuthActivity extends AppCompatActivity {
    public static final int RC_SIGN_IN = 100;

    SignInButton signInButton;


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

        signInButton = findViewById(R.id.signInButton);

        signInButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Choose authentication providers
                List<AuthUI.IdpConfig> providers = Arrays.asList(
                        new AuthUI.IdpConfig.GoogleBuilder().build());

                // Create and launch sign-in intent
                startActivityForResult(
                        AuthUI.getInstance()
                                .createSignInIntentBuilder()
                                .setAvailableProviders(providers)
                                .build(),
                        RC_SIGN_IN);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == RC_SIGN_IN) {
            IdpResponse response = IdpResponse.fromResultIntent(data);

            if (resultCode == RESULT_OK) {
                Intent intent = new Intent(AuthActivity.this, MainActivity.class);
                startActivity(intent);
            } else {
                Toast.makeText(this, "Login Failed! Please try again.", Toast.LENGTH_LONG).show();
            }
        }
    }
}

和MainActivity文件

    public class MainActivity extends AppCompatActivity {
    public static final int RC_SIGN_IN = 100;
    ListView listView;
    ArrayList<String> titlesArray;

    FirebaseDatabase database;
    DatabaseReference databaseReference;
    FirebaseUser user;
    ChildEventListener childEventListener;

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

        listView = findViewById(R.id.listView);
        titlesArray = new ArrayList();

        //Get the associated login user info
        user = FirebaseAuth.getInstance().getCurrentUser();

        //Write a message to the database
        database = FirebaseDatabase.getInstance();
        databaseReference = database.getReference().child("notes").child(user.getUid());

        //Adding adapter to the list of titles
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, titlesArray);
        listView.setAdapter(adapter);

        childEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                Note notes = dataSnapshot.getValue(Note.class);
                titlesArray.add(notes.getTitle());
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

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

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(MainActivity.this, "Loading failed!", Toast.LENGTH_SHORT).show();
            }
        };

        databaseReference.addChildEventListener(childEventListener);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.sign_out_menu:
                AuthUI.getInstance()
                        .signOut(this);
                return true;
            case R.id.add_new:
                Intent intent = new Intent(MainActivity.this, AddActivity.class);
                startActivity(intent);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

}
android android-listview
1个回答
4
投票

这是因为从Firebase回调获取数据后,您没有通知适配器。

只需像下面那样替换您的听众。

childEventListener = new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        Note notes = dataSnapshot.getValue(Note.class);
        titlesArray.add(notes.getTitle());
        adapter.notifyDataSetChanged();
    }

    @Override
    public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

    }

    @Override
    public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

    }

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

    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Toast.makeText(MainActivity.this, "Loading failed!", Toast.LENGTH_SHORT).show();
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.