Начать следующее действие, если база данных Firebase не имеет дочернего значения - PullRequest
0 голосов
/ 13 января 2019

Я использую для заполнения базы данных Firebase формы Recycleview Adapter в Деятельности A. Я ищу решение для возврата в Mainactivity, когда у него пустой родительский или нет дочернего.

Вот мой код

public class SubjectBooks extends AppCompatActivity {
    FirebaseAuth fauth;
    String user;
    DatabaseReference dbreference,dbref;
    RecyclerView rv;
    String subject;
    int child_count=0;
    ArrayList<Books> list;
    SubjectBooksAdapter staggeredBooksAdapter;
    ProgressDialog progressDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_subject_books);
       


        fauth = FirebaseAuth.getInstance();
        subject = getIntent().getStringExtra("subject").trim();

        dbreference = FirebaseDatabase.getInstance().getReference("books").child(subject);
        dbreference.keepSynced(true);
        user = fauth.getCurrentUser().getEmail();

      

        final ProgressDialog  progressDialog = ProgressDialog.show(this, "Loading...", "Please wait...", true);
        progressDialog.setMessage("Please wait ...");
        progressDialog.setCanceledOnTouchOutside(true);
        progressDialog.show();

       
        dbreference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                final Books b1 = dataSnapshot.getValue(Books.class);
              //  Log.e("Value is ",dataSnapshot.getKey()+" "+b1.getBauthor());
                //Log.e("Book"," received");
                if(!user.equals(b1.getSelleremail()) || (user.equals(b1.getSelleremail())) ) {

                    child_count++;
                    list.add(b1);
                    staggeredBooksAdapter.notifyDataSetChanged();

                    progressDialog.dismiss();
                }
                


             
              if(child_count==0){
                   progressDialog.dismiss();
                    Toast.makeText(SubjectBooks.this, "No books found!", Toast.LENGTH_SHORT).show();
                   Intent in = new Intent(SubjectBooks.this,MainActivity.class);
                   startActivity(in);
                    finish();
               }
            }

Я изначально объявил

int child_count=0;

Но также, когда у него нет дочерних значений ... все равно progressDialog продолжает загружаться бесконечно, пока не будет нажата какая-либо клавиша.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Вы можете использовать существует, чтобы проверить, существует ли путь, который ссылается на вашу ссылку на базу данных

 dbreference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                if(!dataSnapshot.exists()){

                final Books b1 = dataSnapshot.getValue(Books.class);
              //  Log.e("Value is ",dataSnapshot.getKey()+" "+b1.getBauthor());
                //Log.e("Book"," received");
                if(!user.equals(b1.getSelleremail()) || (user.equals(b1.getSelleremail())) ) {

                    child_count++;
                    list.add(b1);
                    staggeredBooksAdapter.notifyDataSetChanged();

                    progressDialog.dismiss();
                }




           }else{
                    progressDialog.dismiss();
                    Toast.makeText(SubjectBooks.this, "No books found!", Toast.LENGTH_SHORT).show();
                    Intent in = new Intent(SubjectBooks.this,MainActivity.class);
                    startActivity(in);
                    finish();

            }
}

существует

exist () возвращает логическое значение

Возвращает true, если этот DataSnapshot содержит какие-либо данные. Это немного более эффективно, чем использование snapshot.val ()! == null.

Это проверит, есть ли данные внутри пути, на который указывает dbReference, но не проверит, если дочерние элементы внутри>> 0.

Для этого вы можете проверить после оператора else, есть ли внутри этого узла более 1 дочерний узел

   ...
            }else{

                 long childrenQty = dataSnapshot.getChildrenCount();;
                  if(childrenQty > 0 ) {
                   //We have >= than 1 children to show in our recyclerView  :-)
                  }else{
                   //Theres nothing inside to show in our recyclerView  :-(
                               progressDialog.dismiss();
                               Toast.makeText(SubjectBooks.this, "No books found!", Toast.LENGTH_SHORT).show();
                               Intent in = new Intent(SubjectBooks.this,MainActivity.class);
                               startActivity(in);
                               finish();

                        }
}
0 голосов
/ 13 января 2019

onChildAdded() вызывается только в том случае, если добавлен новый ребенок или ребенок уже существует.

В вашем случае вы не добавили ни одного ребенка, поэтому onChildAdded() никогда не вызывали. поэтому progressDialog продолжает загружаться бесконечно

Чтобы определить, существует ли ребенок, используйте ValueEventListener вместо ChildEventListener. Вот ссылка как использовать ValueEventListener

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...