Автономный вид FirebaseRecyclerAdapter

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

Чтобы избежать дублирования и упростить обслуживание базы данных, я хотел бы добавить ключ к записи базы данных, который позволяет мне возвращать запросы на основе этого ключа. Я изначально хранил данные дважды. Один раз для всех, и один раз, если пользователь присоединился к определенной группе (под groupName).

Чтобы вернуть запрос на основе группы, мой первоначальный поиск был следующим:

databaseReference.child(groupName).child("exerciseId"+mExerciseId).orderByChild(sortOrder).limitToFirst(100);

но я считаю, что дублирования можно избежать, добавив ключ «группа» в мой пост. (это также значительно упрощает обслуживание, поскольку пользователи переключаются между группами).

Запрос базы данных «группа» теперь стал таким:

databaseReference.child("exerciseId"+mExerciseId).orderByChild("group").equalTo(groupName);

Все хорошо, за исключением того, что данные больше не сортируются по "sortOrder". Поскольку firebase не допускает нескольких критериев сортировки, я считаю, что мое решение заключается в автономной сортировке.

Итак, как же отсортировать адаптер в автономном режиме?

Мой адаптер довольно стандартный:

mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(Post.class, R.layout.item_post, PostViewHolder.class, dataQuery)

{

    @Override
    protected void populateViewHolder(final PostViewHolder viewHolder, final Post model, final int position)
    {

        final DatabaseReference postRef = getRef(position);

        // Bind Post to ViewHolder, setting OnClickListener for the star button
        viewHolder.bindToPost(model, position, postRef.getKey(), null);

    }

    mRecycler.setAdapter(mAdapter);
}

Я реализовал Comparable в Post, проблема в том, где хранятся данные, чтобы я мог передать их в Collections.sort() таким образом:

private List<Post> mPosts = new ArrayList<>();
mPosts.add(model);

Collections.sort(mPosts, Post.Comparators.ALLTIME);

person Simon Huckett    schedule 08.11.2016    source источник


Ответы (2)


Адаптеры в библиотеке FirebaseUI в настоящее время всегда отображают данные в том порядке, в котором они возвращаются базовой ссылкой FirebaseDatabase или Query.

Вы можете отправить для него запрос на добавление функции в репозиторий Github (поскольку я не убедитесь, что это описано в этом). В качестве альтернативы вы можете разветвить библиотеку и создать собственную реализацию этой функциональности.

person Frank van Puffelen    schedule 08.11.2016
comment
Спасибо за быстрый ответ. Он работает без упрощения, поэтому я вернусь к нему, когда закончу остальные 20 пунктов ;-) Являются ли цепные запросы или критерии сортировки цепочками чем-то в готовящемся списке функций для Firebase? Было бы здорово показать 100 лучших результатов в таблице лидеров, а затем добавить пользователя в список, если он еще не показан, или показать 50 с каждой стороны от текущего пользователя. Все приятные улучшения, но не существенные. Спасибо еще раз. - person Simon Huckett; 08.11.2016
comment
Я думаю, подумав об этом еще немного, я мог бы заполнить свой собственный список на основе одного запроса, а затем отсортировать его/добавить к нему, а затем показать все результаты в recyclerview. Не уверен, как мне заполнить список на основе запроса Firebase - мне придется искать, если у вас нет ссылки на хороший пример? - person Simon Huckett; 08.11.2016

Чтобы оставить отзыв о решении, которое я придумал. В итоге я заполнил свой собственный список, который затем можно отсортировать или добавить (при использовании нескольких запросов) в зависимости от того, чего я пытаюсь достичь. Затем это отображается с помощью стандартного адаптера RecyclerView. Это прекрасно работает.

private final List<Post> postList = new ArrayList<>();

dataQuery.addListenerForSingleValueEvent(new ValueEventListener()
{
    @Override
    public void onDataChange(DataSnapshot dataSnapshot)
    {
        postList.clear();   // in this example it's a newQuery, so clear postList
        for (DataSnapshot child : dataSnapshot.getChildren())
        {
            Post post = child.getValue(Post.class);
            postList.add(post);

            int myPosition = sortData();    // uses Collections.sort() to sort data

            mAdapter.addPosts(postList);
            mAdapter.notifyDataSetChanged();
            mRecycler.scrollToPosition(myPosition);
        }
    }
});
person Simon Huckett    schedule 28.11.2016