Когда я получаю свои данные из базы данных реального времени firebase, они автоматически перечисляются в порядке возрастания, но я пытаюсь получить значения, которые я помещаю в массив, чтобы они были перечислены в обратном порядке, а не в порядке возрастания.
Можно ли получить обратный порядок значений при работе со списком?
В настоящее время используется код:
Query query = userRef.orderByChild("totalNumberOfSteps");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String username = ds.child("username").getValue(String.class);
long totalNumberOfSteps = ds.child("totalNumberOfSteps").getValue(Long.class);
Log.d(TAG , username + " - Steps: " + totalNumberOfSteps);
arrayList.add(new String(username + " - " + "steps: " + totalNumberOfSteps));
arrayAdapter = new ArrayAdapter<>(Leaderboard.this , android.R.layout.simple_list_item_1 , arrayList);
listView.setAdapter(arrayAdapter);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG , databaseError.getMessage()); //Don't ignore errors!
}
};
query.addListenerForSingleValueEvent(valueEventListener);}}
Текущий вывод этого кода:
John Doe VI - Steps: 0
John Doe III - Steps: 0
John Doe V - Steps: 12
John Doe I - Steps: 79
John Doe IV - Steps: 88
John Doe II - Steps: 111
Предпочтительный выход:
John Doe II - Steps: 111
John Doe IV - Steps: 88
John Doe I - Steps: 79
John Doe V - Steps: 12
John Doe III - Steps: 0
John Doe VI - Steps: 0
При добавлении Collections.reverse(arrayList);
к коду вывод:
John Doe II - Steps: 111
John Doe IV - Steps: 88
John Doe III - Steps: 0
John Doe VI - Steps: 0
John Doe V - Steps: 12
John Doe I - Steps: 79
Вы можете отменить ArrayList, прежде чем предоставлять его ArrayAdapter, выполнив следующие действия:
Collections.reverse(arrayList);
В вашем случае скопируйте arrayList
, прежде чем отменить его и передать конструктору ArrayAdapter:
ArrayList<> tmpArr = new ArrayList<>(arrayList);
Collections.reverse(tmpArr);
arrayAdapter = new ArrayAdapter<>(Leaderboard.this , android.R.layout.simple_list_item_1 , tmpArr );
В противном случае объект arrayList
будет переворачиваться каждый раз, когда вызывается onDataChange(), и его порядок будет перепутан.
Каков ваш результат при копировании ArrayList перед его изменением? ArrayList<> tmpArr = new ArrayList<>(arrayList); Collections.reverse(tmpArr);
(используйте tmpArr для адаптера)
без добавления этой строки она находится в порядке возрастания, как показано в текущем выводе, указанном в вопросе.
Ok. Каков результат при использовании кода моего предыдущего комментария? (используйте tmpArr для ArrayAdapter)
Должен ли я с помощью tmpArr удалить текущий arrayAdapter
, который используется? немного запутался на данный момент
Нет, просто попробуйте изменить последний аргумент конструктора arrayAdapter с arrayList на tmpArr вот так arrayAdapter = new ArrayAdapter<>(Leaderboard.this , android.R.layout.simple_list_item_1 , tmpArr);
Работает как шарм! Не могу выразить мою благодарность словами, ха-ха, большое спасибо!
При добавлении
Collections.reverse(arrayList);
к моему коду он действительно меняет порядок, но не полностью, я отредактирую свой вопрос, чтобы вы могли видеть