Как обновить данные в FirebaseAdapter с помощью FirebaseUI при изменении запроса? - PullRequest
0 голосов
/ 11 сентября 2018

Я хочу разрешить пользователям сортировать и фильтровать данные. У меня есть эта реализация Firebase Adapter, и все работает отлично. Когда я хочу отфильтровать данные, используя, например, цена, данные в RecyclerView не меняются. Не могли бы вы помочь и рассказать, что я делаю не так?

Это запрос - зависит от того, какой пользователь выбран из Spinner:

Query query;

if (!priceLower.equals("Any")) {    // option from Spinner
    query = FirebaseDatabase.getInstance()
            .getReference()
            .child("Students")
            .orderByChild("price")
            .startAt(priceLower)
            .limitToLast(50);
} else if (!priceHigher.equals("Any")) {
    query = FirebaseDatabase.getInstance()
            .getReference()
            .child("Students")
            .orderByChild("price")
            .endAt(priceHigher)
            .limitToLast(50);
} else {
    query = FirebaseDatabase.getInstance()
            .getReference()
            .child("Students")
            .orderByChild("price")
            .limitToLast(50);
}

getData(query);

Это метод для извлечения данных из Firebase:

 public void getData(Query query) {
        FirebaseRecyclerOptions<Students> firebaseOptions =
                new FirebaseRecyclerOptions.Builder<Students>()
                        .setQuery(query, Students.class)
                        .build();

        FirebaseAdapter = new FirebaseRecyclerAdapter<Students, StudentsHolder>(firebaseOptions) {
            @NonNull
            @Override
            public StudentsHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_students, parent, false);
                return new StudentsHolder(view);
            }
            @Override
            protected void onBindViewHolder(@NonNull StudentsHolder holder, int position, @NonNull final Students student) {
                holder.setName(student.getName());
                holder.setPrice(student.getPrice());

                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                       // ...
                    }
                });
            }
            @Override
            public void onDataChanged() {       
                progressDialog.setVisibility(View.GONE);
                mRecyclerView.setAdapter(FirebaseAdapter);    
            }
        };
    }

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Чтобы решить эту проблему, вы должны добавить в конце вашего getData() метода следующую строку кода:

FirebaseAdapter.startListening();

Это означает, что каждый раз, когда вы меняете запрос, вы создаете и настраиваете новый адаптер, а также начинаете прослушивать изменения.

0 голосов
/ 11 сентября 2018
@Override
        public void onDataChanged() {       
            progressDialog.setVisibility(View.GONE);
            mRecyclerView.setAdapter(FirebaseAdapter);    
        }

Этот метод вызывается только при изменении данных в базе данных Firebase. Но согласно вашему требованию эти данные остаются прежними, и меняется только ваш примененный фильтр или метод сортировки. Поэтому этот метод никогда не будет вызываться, и firebaseadapter будет отражать только оригинальный запрос.

Попробуйте это так:

   public void getData(Query query) {
    FirebaseRecyclerOptions<Students> firebaseOptions =
            new FirebaseRecyclerOptions.Builder<Students>()
                    .setQuery(query, Students.class)
                    .build();

    FirebaseAdapter = new FirebaseRecyclerAdapter<Students, StudentsHolder>(firebaseOptions) {
        @NonNull
        @Override
        public StudentsHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_students, parent, false);
            return new StudentsHolder(view);
        }
        @Override
        protected void onBindViewHolder(@NonNull StudentsHolder holder, int position, @NonNull final Students student) {
            holder.setName(student.getName());
            holder.setPrice(student.getPrice());

            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   // ...
                }
            });
        }
        @Override
        public void onDataChanged() {       

        }
    };

     progressDialog.setVisibility(View.GONE);
     mRecyclerView.setAdapter(FirebaseAdapter);   
}

getData() метод должен вызываться всякий раз, когда меняется ваш фильтр.

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