2

In my firebase database I am storing data like this

pic 1

pic 2.

Now I want to retrieve and show the data in decending/latest order on my RecyclerView from firebase realtime database based on timestamp.

I have tried layoutmanager.setReverseLayout(true); and layoutmanager.setStackFromEnd(true); for reversing the RecyclerView but it always shows data from the middle and also I don't want to follow this method. Since i am adding all the data into ArrayList resultsHistory. Now how can i sort the Arraylist based on latest timestamp and then setting my adapter? does it gonna solve the problem?

Below is my code:

@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);
                }
                sortDate();
            }
        }

        @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), 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<HistoryObject> resultsHistory = new ArrayList<HistoryObject>();

private ArrayList<HistoryObject> getDataSetHistory() {
    return resultsHistory;
}

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}


public void sortDate() {
    /*Collections.sort(resultsHistory, new Comparator<HistoryObject>() {
        DateFormat f = new SimpleDateFormat("MMMM dd yyyy, hh:mm a");
        @Override
        public int compare(HistoryObject lhs, HistoryObject rhs) {
            try {
                return f.parse(lhs.getTime()).compareTo(f.parse(rhs.getTime()));
            } catch (ParseException e) {
                throw new IllegalArgumentException(e);
            }
        }
    });*/
    Collections.sort(resultsHistory, new Comparator<HistoryObject>() {
        public int compare(HistoryObject o1, HistoryObject o2) {
            if (o1.getT() == null || o2.getT() == null)
                return 0;
            return o2.getT().compareTo(o1.getT());
        }
    });
    mHistoryAdapter = new HistoryAdapter(resultsHistory, HistoryActivity.this);
    mHistoryRecyclerView.setAdapter(mHistoryAdapter);
}
Sourav Das
  • 55
  • 6

1 Answers1

1

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

Sort data

To retrieve sorted data, start by specifying one of the order-by methods to determine how results are ordered:

orderByChild()

Order results by the value of a specified child key or nested child path.

orderByKey()

Order results by child keys.

orderByValue()

Order results by child values.

Edit 2

If you wan't to sort arraylist u can use comparable and comparator

Example https://beginnersbook.com/2013/12/java-arraylist-of-object-sort-example-comparable-and-comparator/

Ashvin solanki
  • 4,802
  • 3
  • 25
  • 65