gpt4 book ai didi

java - 必须关闭并重新启动应用程序才能在 map 上显示正确的位置

转载 作者:行者123 更新时间:2023-11-30 05:18:08 26 4
gpt4 key购买 nike

从 Firebase 检索帖子的位置(纬度和经度)时,只有在停止应用并重新启动后,才会检索正确的位置并将标记放置在正确的位置。否则,我会得到其他帖子的位置...

谁能向我解释一下为什么会发生这种情况?因此,如果我上传新帖子,然后尝试打开其位置,除非我停止应用程序并重新输入,否则它不会给我返回正确的位置。如果我一次完成所有操作,它就会给我另一篇文章的位置。

我认为这是我的 Adapter 的问题,因为当我从 ProfileFragment 中提取帖子时,它总是给我返回正确的位置。

我将 postidPostAdapter.java 类传输到 MapsActivityUser.class 的方式是使用 Intent,因此正确的帖子可以在 Firebase 中找到。我该如何解决这个问题,更重要的是为什么会发生这种情况?

PostAdapter.java

public class PostAdapter extends RecyclerView.Adapter<PostAdapter.ViewHolder> {

public Context mContext;
public List<Post> mPost;

public Post post;

public PostAdapter(Context mContext, List<Post> mPost) {
this.mContext = mContext;
this.mPost = mPost;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.post_item, parent, false);
return new PostAdapter.ViewHolder(view);

}

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {

firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
post = mPost.get(position);

Glide.with(mContext).load(post.getPostimage())
.apply(new RequestOptions().placeholder(R.drawable.placeholderimg))
.into(holder.post_image);

if ("".equals(post.getText_location())) {
holder.text_location.setVisibility(View.GONE);
} else {
holder.text_location.setVisibility(View.VISIBLE);
holder.text_location.setText(post.getText_location());

public class ViewHolder extends RecyclerView.ViewHolder {

public TextView text_location;

public ViewHolder(@NonNull View itemView) {
super(itemView);

text_location = itemView.findViewById(R.id.text_location);

text_location.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mContext, MapsActivityUser.class);
intent.putExtra("postid", post.getPostid());
mContext.startActivity(intent);
}
});
}
}
}

MapsActivityUser.java

public class MapsActivityUser extends FragmentActivity implements OnMapReadyCallback {

String postid;
private GoogleMap map;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps_user);

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);

postid = getIntent().getStringExtra("postid");
}

@Override
public void onMapReady(GoogleMap googleMap) {
map = googleMap;

final DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts").child(postid);
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Post post = dataSnapshot.getValue(Post.class);
if (post != null) {
double latitude = post.getLocation().getLatitude();
double longitude = post.getLocation().getLongitude();

LatLng location = new LatLng(latitude, longitude);
map.addMarker(new MarkerOptions().position(location).title("Event location"));
map.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 10));
} else {
Toast.makeText(MapsActivityUser.this, "Event doesn't have location on map", Toast.LENGTH_SHORT).show();
}
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
});
}
}

MapsActivityuser.java 使用 RecyclerView 更新了代码

public class MapsActivityUser extends FragmentActivity implements OnMapReadyCallback {

String postid;
private GoogleMap map;
private RecyclerView mRecyclerView;
private PostAdapter mPostAdapter;
private List<Post> mPostList;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps_user);

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);

postid = getIntent().getStringExtra("postid");

mRecyclerView = findViewById(R.id.recycler_view);
mRecyclerView.setHasFixedSize(true);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(linearLayoutManager);
mPostList = new ArrayList<>();
mPostAdapter = new PostAdapter(this, mPostList, postid);
mRecyclerView.setAdapter(mPostAdapter);

}

@Override
public void onMapReady(GoogleMap googleMap) {
map = googleMap;

final DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts").child(postid).child("location");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
double latitude = dataSnapshot.child("latitude").getValue(Double.class);
double longitude = dataSnapshot.child("longitude").getValue(Double.class);

LatLng location = new LatLng(latitude, longitude);
map.addMarker(new MarkerOptions().position(location).title("Event location"));
map.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 10));
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
});
}

@Override
public void onPostClick(int position) {
//
}
}

最佳答案

你的做法是错误的。想想幕后发生了什么。每次调用适配器的 onBindViewHolder() 方法并执行 post = mPost.get(position); 时,帖子都会在每次调用时更新。这就是为什么您没有获得正确的帖子 ID 的原因。您可能不想将帖子设置为每次调用 onBindViewHolder() 更新的最后一个也是唯一的值。

我假设您想要某种文本字段来显示您的帖子的位置,具体取决于单击的内容。

你的位置变量真的很困惑,这不是正确的位置,你应该使用getAdapterPosition()

关于java - 必须关闭并重新启动应用程序才能在 map 上显示正确的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60042150/

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