【问题标题】:Is there a way to sort the firebaserecyclerview after I calculate value after retrieving data?在检索数据后计算值后,有没有办法对 firebaserecyclerview 进行排序?
【发布时间】:2019-01-07 09:38:09
【问题描述】:

我正在使用 firebase 数据库来存储用户的 lat 和 lng。以这种方式,

现在,当我在我的 recyclerview 中检索它们时,我使用以下代码计算从我当前位置到该用户位置的距离,

private void loadLocationForThisUser(Double lat, Double lng, Double lat1, 
    Double lng1) {


        //Create location from user coordinates
        currentUser1 = new Location("");
        currentUser1.setLatitude(lat);
        currentUser1.setLongitude(lng);

        //Create location from friend coordinates
        friend1 = new Location("");
        friend1.setLatitude(lat1);
        friend1.setLongitude(lng1);

        distance = (new DecimalFormat("#.#").format((currentUser1.distanceTo(friend1)) / 1000)+ "km");
}

并在我的 firebase recyclerview 适配器中按以下方式调用此方法,

FirebaseRecyclerOptions<Contacts> options = new FirebaseRecyclerOptions.Builder<Contacts>()
            .setQuery(UsersRef, Contacts.class)
            .build();

    adapter = new FirebaseRecyclerAdapter<Contacts, FindFriendViewHolder>(options) {
        @Override
        protected void onBindViewHolder(@NonNull final FindFriendViewHolder holder, int position, @NonNull final Contacts model) {

            lat = mLastLocation.getLatitude();
            lng = mLastLocation.getLongitude();
            lat1 = Double.parseDouble(model.getMylat());
            lng1 = Double.parseDouble(model.getMylng());                   
            loadLocationForThisUser(lat, lng, lat1, lng1);
            holder.txt_distance.setText(distance);
        }

        @NonNull
        @Override
        public FindFriendViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {

            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.users_display_layout_small, viewGroup, false);
            FindFriendViewHolder viewHolder = new FindFriendViewHolder(view);
            return viewHolder;
        }
    };
    adapter.startListening();
    FindFriendsRecyclerList.setAdapter(adapter);
    adapter.notifyDataSetChanged();
} 

这会在我的 recyclerview 中填充用户及其距离的视图持有者,即他们与我的距离。但是该列表是按照它存储在 firebase 数据库中的顺序填充的,因此用户列表没有根据他们的距离进行排序。如果用户 A 比用户 B 离我更远,但在数据库中他存储在用户 B 之上,那么在输出中用户 A 也在用户 B 之上。预期的输出是用户 B 应该在回收站视图中高于用户 A 作为他的距离与用户 A 相比,它要小。因此,对于所有用户,它应该检查谁离我更近,并将它们放在比我远的上面,基本上根据与我的距离对它们进行排序。

【问题讨论】:

标签: android firebase firebase-realtime-database android-recyclerview firebaseui


【解决方案1】:

FirebaseUI 适配器将按照查询返回的顺序显示项目。没有内置的方法可以在客户端重新排序项目。

您可以尝试此处显示的 getItem 技巧:https://stackoverflow.com/a/40383539

但如果这对您不起作用,您将不得不实现自己的适配器:firebaserecycleradapter sort/compare/reorder data before populate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多