Необходимо закрыть и перезапустить приложение для правильного расположения, которое будет показано на карте - PullRequest
1 голос
/ 03 февраля 2020

При извлечении местоположения поста (Широта и Долгота) из Firebase извлекается правильное местоположение, и маркер помещается в правильное место только после остановки приложения и его повторного запуска. В противном случае, я узнаю местонахождение другого поста ...

Кто-нибудь может объяснить мне, почему это происходит? Поэтому, если я загружу новое сообщение, а затем попытаюсь открыть его местоположение, оно не вернет мне правильное местоположение, если я не остановлю приложение и снова войду в него. Если я делаю все из одного go, это дает мне местоположение другого сообщения.

Я думаю, что у меня проблема с моим Adapter, потому что когда я поднимаю сообщение из моего ProfileFragment он всегда возвращает мне правильное местоположение.

Я перевожу postid из моего PostAdapter.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) {
      //
    }
}

1 Ответ

1 голос
/ 03 февраля 2020

Ваш подход такой неправильный. Подумай о том, что происходит под капотом. Каждый раз, когда вызывается метод onBindViewHolder() вашего адаптера и выполняется post = mPost.get(position);, то есть сообщение обновляется при каждом вызове. Вот почему вы не получаете правильные идентификаторы. Вы, вероятно, не хотите устанавливать последнее и единственное значение, которое обновляется вызовом onBindViewHolder() каждый раз.

Я предполагаю, что вам нужно какое-то текстовое поле для отображения местоположения ваших сообщений в зависимости от того, на что нажали.

Ваша переменная положения действительно испорчена , и это неправильная позиция, вместо этого вы должны использовать getAdapterPosition().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...