如何在 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
未解析。
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
未解析。