gpt4 book ai didi

android - 使用 GeoFire 在 android 中填充 Firebase Recycler View

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:10:54 24 4
gpt4 key购买 nike

我想填充我的回收站 View ,这样我就可以看到附近的人/地点。我正在使用 GeoFire 查询我的数据库,它看起来像这样。

 GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(latLngCenter.latitude, latLngCenter.longitude), 0.1);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
System.out.println(String.format("Key %s entered the search area at [%f,%f]", key, location.latitude, location.longitude));
Log.e("TAG", key + location.latitude + location.longitude);

}

@Override
public void onKeyExited(String key) {
System.out.println(String.format("Key %s is no longer in the search area", key));
}

@Override
public void onKeyMoved(String key, GeoLocation location) {
System.out.println(String.format("Key %s moved within the search area to [%f,%f]", key, location.latitude, location.longitude));
Log.e("TAG", key + location.latitude + location.longitude);
}

@Override
public void onGeoQueryReady() {
System.out.println("All initial data has been loaded and events have been fired!");
}

@Override
public void onGeoQueryError(DatabaseError error) {
System.err.println("There was an error with this query: " + error);
}
});

我正在使用这个 Firebase RecyclerView

 RecyclerView recycler = (RecyclerView) findViewById(R.id.RecyclerView);
recycler.setHasFixedSize(true);
recycler.setLayoutManager(new LinearLayoutManager(this));

FirebaseRecyclerAdapter<Chat, ChatHolder> mAdapter = new FirebaseRecyclerAdapter<Chat, ChatHolder>(Chat.class, R.layout.recyclerview, ChatHolder.class, mUsers) {


@Override
public void populateViewHolder(final ChatHolder chatMessageViewHolder, final Chat chatMessage, int position) {


chatMessageViewHolder.setName(chatMessage.getName());
chatMessageViewHolder.setText(chatMessage.getText());
chatMessageViewHolder.setTimestamp(chatMessage.getTimestamp());



}
};
recycler.setAdapter(mAdapter);

使用这些 Chat Holder 类和聊天对象类

public static class ChatHolder extends RecyclerView.ViewHolder {
View mView;

public ChatHolder(View itemView) {
super(itemView);
mView = itemView;
}



public void setName(String name) {
TextView field = (TextView) mView.findViewById(R.id.textViewName);
field.setText(name);
}

public void setText(String text) {
TextView field = (TextView) mView.findViewById(R.id.textViewMessage);
field.setText(text);
}

public void setTimestamp(String text) {
TextView field = (TextView) mView.findViewById(R.id.textViewTime);
field.setText(text);
}
}

public static class Chat {

String name;
String text;
String uid;
String timestamp;

public Chat() {
}

public Chat(String name, String uid, String message, String timestamp) {
this.name = name;
this.text = message;
this.uid = uid;
this.timestamp = timestamp;
}

public String getName() {
return name;
}

public String getUid() {
return uid;
}

public String getText() {
return text;
}

public String getTimestamp() {
return timestamp;
}
}

目前,FirebaseUI 库中提供的这个适配器填充 recyclerview,以便只使用一个引用,所有子事件都显示在 View 中,现在,我想填充我的 recyclerView,这样每当输入一个键时,它就会根据我的键填充我的 recyclerview = 到我的引用,这就是我的 firebase 数据库的样子 my firebase database

最佳答案

将您从 geofire 检索到的所有数据(也是 uid)推送到新节点以将 geofire 结果存储在 firebase 中会更简单,例如

my-node //your new firebase node to store all uids retrieved from geofire
- {chatUid}: true //true is just a dummy data, you can use anything else except null and empty string.
- {chatUid}: true
- ...

并将 FirebaseRecyclerAdapter ref 设置到该节点。

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("my-node");
FirebaseRecyclerAdapter fra = new FirebaseRecyclerAdapter<Boolean, MyVH>(Boolean.class, R.layout.my_layout, MyVH.class, ref) { ... }

然后,在 FirebaseRecyclerAdapter 实现的 populateViewHolder() 方法中,您可以使用 String 键从包含数据的主节点获取数据。

public void populateViewHolder(MyVH viewHolder, Boolean model, int position){
// Get references of child views
final TextView nameTextView = viewHolder.getItemView().findViewById(R.id.my_name_text_view_in_vh_layout);
final TextView addressTextView = viewHolder.getItemView().findViewById(R.id.my_address_text_view_in_vh_layout);

// Key in this position.
String key = getRef(position).key;

// Query the full data of the current key located in the `main-data-node`
FirebaseDatabase.getInstance().getReference("main-data-node").child(key).addValueEventListener(new ValueEventListener(){
... //Truncated onCancelled

@Override
public void onDataChange(snap: DataSnapshot){
MyDataModel model = snap.getValue(MyDataModel.class);

nameTextView = model.getName();
addressTextView = model.getAddress();
}
}
}

// The data model class
public class MyDataModel {
private String name;
private String address;
... // Truncated getter, setter, constructor
}

对于 geofire 结果的任何变化,只需将这些结果推送到 my-node,它会自动通知您的 FirebaseRecyclerAdapter

附言我懒得将我的解决方案与您的数据模型相匹配(抱歉),所以我制作了一个简化的示例类,因此如果有人偶然发现了这个,他们可以更容易地理解它。

附言我已经有一段时间没有使用 java 编写代码了,我主要使用 kotlin(你很快应该也会了,哈哈),所以,如果那里有语法错误,请随时进行编辑。

关于android - 使用 GeoFire 在 android 中填充 Firebase Recycler View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38813192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com