Firebase .orderByChild - пытается упорядочить числа, но только первые цифры - PullRequest
0 голосов
/ 26 марта 2020

Я использую FirebaseRecyclerAdapter.

У меня много узлов с дочерним "maxValue". Допустим, у меня есть пять узлов, максимальные значения каждого из которых перечислены 34, 210, 90, 315, 74.

Я ожидал .oderByChild ("maxValue"), чтобы упорядочить их следующим образом: 315, 210, 90, 74, 34.

Однако он возвращает их как 90, 74, 210, 34, 314.

Таким образом, он проверяет первый di git, затем, если две записи имеют тот же первый di git, затем сортируется по второму di git.

Мне нужно его отсортировать по значению целого числа. Возможно ли это, или мне придется взять данные и отсортировать их самостоятельно?

Редактировать: Вот мой полный код настройки FirebaseRecyclerAdapter.

Query query = databaseReference.orderByChild("maxValue");

FirebaseRecyclerOptions<ExerciseMaxesModelClass> options = new FirebaseRecyclerOptions
                .Builder<ExerciseMaxesModelClass>()
                .setQuery(query, ExerciseMaxesModelClass.class)
                .build();

        firebaseAdapter = new FirebaseRecyclerAdapter<ExerciseMaxesModelClass, ExerciseMaxesViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull ExerciseMaxesViewHolder holder, int position,
                                            @NonNull ExerciseMaxesModelClass model) {

                holder.setDate(model.getDate());
                holder.setExerciseName(model.getExerciseName());
                holder.setIsImperial(model.isIsImperial());
                holder.setIsImperialPOV(isImperial);
                holder.setMaxValue(model.getMaxValue());

            }

            @Override
            public ExerciseMaxesViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.exercise_maxes_list_item, parent, false);

                return new ExerciseMaxesViewHolder(view);
            }
        };

Что пример узла выглядит так:

Bench Press (Barbell - Flat)
    - date: "2019-11-28"
    - exerciseName: "Bench Press (Barbell - Flat)"
    - isImperial: true
    - maxValue: "315"

Редактировать 2: Я доволен обходным решением, которое я опубликовал в качестве ответа, но, очевидно, я пока не могу принять свой собственный ответ , Теперь, когда я смотрю на узел, ответ может быть просто потому, что я храню максимальное значение в виде строки, поэтому оно, конечно, не сортирует его как целое число.

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Редактировать : Вероятно, потому, что я храню значение в виде строки, а не целого числа. Иногда это самая простая вещь.

Вот мой обходной код, так или иначе, на случай, если по какой-то причине вам понадобится сохранить число в виде строки.

Go через каждый узел по заданной c ссылке на базу данных, добавляя каждый ModelClass в массив данных. Затем используйте Collections.sort для этого массива. На самом деле довольно просто отсортировать список объектов по переменной. Затем создайте быстрый адаптер, используя класс ViewHolder, который вы уже использовали в своем FirebaseReyclerAdapter, и добавьте отсортированный список.

Мой обходной код выглядит следующим образом:

// within .addListenerForSingleValueEvent's onDataChange method
int inc = 0;
for(DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()){

    modelClassArrayList.add(dataSnapshot1.getValue(ExerciseMaxesModelClass.class));

    inc++;

    if(inc == dataSnapshot.getChildrenCount()){

        Collections.sort(modelClassArrayList, new Comparator<ExerciseMaxesModelClass>() {
            @Override
            public int compare(ExerciseMaxesModelClass o1, ExerciseMaxesModelClass o2) {
                return Double.compare(Double.parseDouble(o1.getMaxValue()),
                                        Double.parseDouble(o2.getMaxValue()));
                }
            });

        MaxesAdapter adapter = new MaxesAdapter(modelClassArrayList, isImperial);

        recyclerView.setAdapter(adapter);

    }
}
0 голосов
/ 26 марта 2020

Firebase сортирует данные в порядке возрастания, поэтому вы получаете 90, 74, 210, 34, 314. Единственный способ - извлечь их, а затем добавить данные в List и выполнить:

Collection.reverse(myList);

https://firebase.google.com/docs/database/android/lists-of-data

https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#reverse - java .util.List-

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