Как отсортировать данные списка <Model>после загрузки Android - PullRequest
0 голосов
/ 02 июня 2019

Я получаю данные и добавляю их в список из базы данных Firebase. Теперь я хочу отсортировать данные списка по времени, чтобы сначала в списке появились последние данные, а затем установить обновленный список в мой RecyclerView.Adapter. Я пробовал layoutmanager.setReverseLayout(true); и layoutmanager.setStackFromEnd(true); для обращения к RecyclerView, но он всегда показывает данные из середины, а также я не хочу следовать этому методу. Как я могу это сделать.

public class HistoryActivity extends AppCompatActivity{
private String customerOrDriver, userId;
private String doctorId, patientId, pharmacyId, userDriverOrCustomer;
private Long timestamp;
private String name, service;

private SwipeRefreshLayout swipeRefreshLayout;

private RecyclerView mHistoryRecyclerView;
private RecyclerView.Adapter mHistoryAdapter;
private RecyclerView.LayoutManager mHistoryLayoutManager;
SharedPreferences sharedPreferences;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_history);

    customerOrDriver = getIntent().getExtras().getString("customerOrDriver");
    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(HistoryActivity.this);

    userId = sharedPreferences.getString("UID","");

    mHistoryRecyclerView = (RecyclerView) findViewById(R.id.historyRecyclerView);

    mHistoryAdapter = new HistoryAdapter(getDataSetHistory(), HistoryActivity.this);
    mHistoryLayoutManager = new LinearLayoutManager(HistoryActivity.this);
    mHistoryRecyclerView.setLayoutManager(mHistoryLayoutManager);
    mHistoryRecyclerView.setHasFixedSize(true);
    /*// sort the recycler view to descending order
    ((LinearLayoutManager) mHistoryLayoutManager).setReverseLayout(true);
    ((LinearLayoutManager) mHistoryLayoutManager).setStackFromEnd(true);*/
    mHistoryRecyclerView.setItemAnimator(new DefaultItemAnimator());
    mHistoryRecyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
    mHistoryRecyclerView.setAdapter(mHistoryAdapter);


    getUserHistoryIds();
}

private void getUserHistoryIds() {
    //swipeRefreshLayout.setRefreshing(true);
    DatabaseReference userHistoryDatabase = FirebaseDatabase.getInstance().getReference().child(Common.user_table).child(customerOrDriver).child(userId).child(Common.history_table);
    userHistoryDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()){
                for(DataSnapshot history : dataSnapshot.getChildren()){
                    FetchRideInformation(history.getKey());
                    //swipeRefreshLayout.setRefreshing(false);
                }
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            //swipeRefreshLayout.setRefreshing(false);
        }
    });
}

private void FetchRideInformation(String rideKey) {
    DatabaseReference historyDatabase = FirebaseDatabase.getInstance().getReference().child(Common.history_table).child(rideKey);
    historyDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()){
                String rideId = dataSnapshot.getKey();
                timestamp = 0L;
                for(DataSnapshot child : dataSnapshot.getChildren()){
                    if (child.getKey().equals("timestamp")){
                        timestamp = Long.valueOf(child.getValue().toString());
                    }
                }
                getRideInformation(rideId, timestamp);
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

private void getRideInformation(final String rideId, final Long timestamp) {
    DatabaseReference historyRideInfoDb = FirebaseDatabase.getInstance().getReference().child(Common.history_table).child(rideId);
    historyRideInfoDb.addListenerForSingleValueEvent(new ValueEventListener() {
        @SuppressLint("SetTextI18n")
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                for (DataSnapshot child : dataSnapshot.getChildren()) {
                    if (child.getKey().equals("patient")) {
                        patientId = child.getValue().toString();
                        if (!patientId.equals(userId)) {
                            userDriverOrCustomer = "Doctors";
                            getUserInformation("Patients", patientId, rideId, timestamp);
                        }
                    }
                    else if (child.getKey().equals("patient")) {
                        patientId = child.getValue().toString();
                        if (!patientId.equals(userId)) {
                            userDriverOrCustomer = "Phamacys";
                            getUserInformation("Patients", patientId, rideId, timestamp);
                        }
                    }
                    if (child.getKey().equals("doctor")) {
                        doctorId = child.getValue().toString();
                        if (!doctorId.equals(userId)) {
                            userDriverOrCustomer = "Patients";
                            getUserInformation("Doctors", doctorId, rideId, timestamp);
                        }
                    }
                    else if (child.getKey().equals("pharmacy")) {
                        pharmacyId = child.getValue().toString();
                        if (!pharmacyId.equals(userId)) {
                            userDriverOrCustomer = "Patients";
                            getUserInformation("Pharmacys", pharmacyId, rideId, timestamp);
                        }
                    }
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

private void getUserInformation(String otherUserDriverOrCustomer, String otherUserId, final String rideId, final Long timestamp) {
    DatabaseReference mOtherUserDB = FirebaseDatabase.getInstance().getReference().child(Common.user_table).child(otherUserDriverOrCustomer).child(otherUserId);
    mOtherUserDB.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
                if (map.get("name") != null) {
                    name = (map.get("name").toString());
                }
                if(map.get("service") == null)
                {
                    service = (map.get("phone").toString());
                }
                else if (map.get("service") != null) {
                    service = (map.get("service").toString());
                }

                HistoryObject obj = new HistoryObject(rideId, name, service, getDate(timestamp));
                resultsHistory.add(obj);
                mHistoryAdapter.notifyDataSetChanged();
            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

private String getDate(Long time) {
    Calendar cal = Calendar.getInstance(Locale.getDefault());
    cal.setTimeInMillis(time*1000);
    String date = DateFormat.format("MMMM dd yyyy, hh:mm a", cal).toString();
    return date;
}

private ArrayList resultsHistory = new ArrayList<HistoryObject>();
private ArrayList<HistoryObject> getDataSetHistory() {

    return resultsHistory;
}

}

Ответы [ 2 ]

0 голосов
/ 02 июня 2019

Вы можете отсортировать свой файл следующим образом

Ее я только что показал вам объект Student, но в вашем случае вы можете проверить с datetime

Использование лямбда-выражения: эквивалентный код Java 8 с использованием лямбда-выражения будет выглядеть следующим образом:

studentlist.sort((Student s1, Student s2)->s1.getName().compareTo(s2.getName()));
0 голосов
/ 02 июня 2019

Просто используйте myList.sort(), затем прочитайте его так, как нужно, например, по возрастанию или по убыванию и вставьте его в RecyclerView

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