如何在 recyclerview 中使用 Hashmap 从 firebase 检索值?

How can I retrieve value from firebase using Hashmap in a recyclerview?

  private void FetchHistoryInformation() {
    
    String user = FirebaseAuth.getInstance().getCurrentUser().getUid();
    ArrayList<HashMap<String, Object>> arrayList = new ArrayList<>();

    DatabaseReference tripRef = FirebaseDatabase.getInstance().getReference(Common.RIDER_INFO_REFERENCE).child(user).child("Trips");
    query = tripRef.orderByChild("tripCount");

    options = new FirebaseRecyclerOptions.Builder<RiderModel>()
            .setLifecycleOwner(this)
            .setQuery(query, RiderModel.class)
            .build();

    adapter = new FirebaseRecyclerAdapter<RiderModel, CompletedTripAdapter>(options) {

        @Override
        protected void onBindViewHolder(@NonNull final CompletedTripAdapter holder, int position,
                                        @NonNull final RiderModel model) {

            query.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    if (dataSnapshot.exists()) {

                        for (DataSnapshot itemSnapshot : dataSnapshot.getChildren()) {
                            HashMap<String, Object> hasmap = new HashMap<>();

                            String pickup = itemSnapshot.child("pickupLocation").getValue(String.class);
                            String destination = itemSnapshot.child("destination").getValue(String.class);
                            long time = itemSnapshot.child("timeStamp").getValue(Long.class);

                            arrayList.add(hasmap);

                            holder.txt_pickup.setText(pickup);

                            holder.txt_destination.setText(destination);

                            holder.txt_trip_status.setText(R.string.status_complete);

                            holder.txt_trip_date.setText(UserUtils.getDate(time));

                            holder.setItemClickListerner(new IRecyclerClickListerner() {
                                @Override
                                public void onItemClickListerner(View view, int pos) {
                                    //
                                    Toast.makeText(getActivity(), adapter.getRef(position).getKey(), Toast.LENGTH_SHORT).show();

                                    Intent intent = new Intent(getActivity(), TripHistorySinglePage.class);

                                    intent.putExtra("destination", destination);
                                    startActivity(intent);

                                }
                            });
                        }
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Toast.makeText(getContext(), "" + databaseError.getMessage(), Toast.LENGTH_SHORT).show();
                }


            });
        }

        @NonNull
        @Override
        public CompletedTripAdapter onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item_completed_trips, parent, false);

            return new CompletedTripAdapter(view);
        }
    };
    recycler_view.setAdapter(adapter);
    adapter.startListening();

}

以上是我的 firebase 数据库结构,我正在尝试使用 Hashmap 从 firebase db 获取数据到 firebaseRecyclerAdapter(我没有使用模型 class 来设置和获取数据我已经使用 hashmap 在火力数据库)。但是当我将数据添加到我的 onBindView 时,我得到了所有项目,但重复了最后一个项目信息。检查下面的结果图片

该项目结果信息重复来自 firebase 数据库中添加的最后一个项目。

我认为您的代码过于复杂了。如果您不想使用自定义模型 class,请传递 into the.

DatabaseReference tripRef = FirebaseDatabase.getInstance().getReference(Common.RIDER_INFO_REFERENCE).child(user).child("Trips");
query = tripRef.orderByChild("tripCount");

options = new FirebaseRecyclerOptions.Builder<DataSnapshot>()
        .setLifecycleOwner(this)
        .setQuery(query, new SnapshotParser<DataSnapshot>() {
            public DataSnapshot parseSnapshot(@NonNull DataSnapshot snapshot) {
                return snapshot;
            }
        })
        .build();

adapter = new FirebaseRecyclerAdapter<DataSnapshot, CompletedTripAdapter>(options) {

    @Override
    protected void onBindViewHolder(@NonNull final CompletedTripAdapter holder, int position,
                                    @NonNull final DataSnapshot snapshot) {
        String pickup = snapshot.child("pickupLocation").getValue(String.class);
        String destination = snapshot.child("destination").getValue(String.class);
        long time = snapshot.child("timeStamp").getValue(Long.class);

        holder.txt_pickup.setText(pickup);
        holder.txt_destination.setText(destination);
        holder.txt_trip_status.setText(R.string.status_complete);
        holder.txt_trip_date.setText(UserUtils.getDate(time));
    }

    @NonNull
    @Override
    public CompletedTripAdapter onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_completed_trips, parent, false);

        return new CompletedTripAdapter(view);
    }
};
recycler_view.setAdapter(adapter);
adapter.startListening();

这里的 new SnapshotParser<DataSnapshot>() {...} 是一个简单的解析器,returns DataSnapshot 未解析。