java - 如何从 firebase 数据库中获取基于时间戳的排序数据

标签 java android firebase firebase-realtime-database android-recyclerview

<分区>

在我的 firebase 数据库中,我正在存储这样的数据

pic 1

pic 2 .

现在我想根据时间戳从 firebase 实时数据库中的 RecyclerView 上以降序/最新顺序检索和显示数据。

我已经尝试过 layoutmanager.setReverseLayout(true);layoutmanager.setStackFromEnd(true); 用于反转 RecyclerView 但它总是从中间显示数据,而且我不想遵循这种方法。 因为我将所有数据添加到 ArrayList resultsHistory 中。现在我如何根据最新的时间戳对 Arraylist 进行排序,然后设置我的适配器?它能解决问题吗?

下面是我的代码:

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

最佳答案

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

排序数据

要检索排序的数据,首先指定一种排序方法以确定结果的排序方式:

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.

编辑2

如果你不想对 arraylist 进行排序,你可以使用 comparablecomparator

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

关于java - 如何从 firebase 数据库中获取基于时间戳的排序数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56409110/

相关文章:

java - 使用 Wicket 在屏幕上打印错误消息

java - 创建自定义 View : how can I extend a class and access the base class's private member variables?

android - 如何在android中获取系统区域设置(不是应用程序)

Android Studio Gradle - settings.gradle 中的 local.properties 变量(路径)

android - 无法解析 com.android.support :design:28. 0.0

typescript - 类型 '{ query: { orderByChild: string; equalTo: string; }; }' 的参数不可分配给类型 'FirebaseListFactoryOpts' 的参数

java - Jhipster Elasticsearch数据迁移

java - 使用 SharedPreferences 保存字节数组

ios - 两个函数从 FireBase 数据库获取数据,第三个函数执行一些计算

Firebase 远程配置 - "user in random percentile"与 key