Кнопка возврата возобновляет работу после обновления документа fire-store

#android #database #firebase #android-activity #google-cloud-firestore

#Android #База данных #firebase #android-активность #google-облако-firestore

Вопрос:

Моя функциональность звучит просто.

У меня есть recycler-view с кучей документов в виде карточек. Когда я нажимаю на элемент, открывается новое действие и показывает мне детали документов, такие как заголовок, содержимое и т.д. Они размещены на TextInputEditText , поэтому их можно редактировать. Как только пользователь внесет изменения и нажмет кнопку «Назад», документ необходимо обновить. Звучит просто, не так ли? Но проблема здесь в том, что когда я нажимаю кнопку «Назад», активность снова открывается сама по себе. Тем не менее, документ все еще обновляется.

Вот мой NoteListAdapter.java код, который реализует onClick прослушиватель для recycler-view элемента.

 package com.seeme.Adapters;

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.snackbar.Snackbar;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.QuerySnapshot;
import com.seeme.FirstScreen;
import com.seeme.Model.Note;
import com.seeme.R;
import com.seeme.UpdateNoteActivity;

import org.w3c.dom.Text;

import java.util.List;
import java.util.Random;

import javax.annotation.Nullable;

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

    private Context context;

    public List<Note> notes;
    private static String TAG = "NoteListAdapter LOG : ";
    private FirebaseFirestore mFirestore;
    private FirebaseAuth mAuth;
    private FirebaseUser mUser;

    public String docID;

    public NoteListAdapter(List<Note> note) {

        this.notes=note;


    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.note_item, parent, false);
        mFirestore = FirebaseFirestore.getInstance();
        mAuth = FirebaseAuth.getInstance();
        mUser = mAuth.getCurrentUser();

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.title_item.setText(notes.get(position).getTitle());
        holder.content_item.setText(notes.get(position).getContent());

        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: OnBindViewHolder   position : "   position);
                retrieveDocid(position);


            }
        });





    }

    private void retrieveDocid(int itemposition) {

        mFirestore.collection("users").document(mUser.getUid()).collection("notes").addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                if (e!=null) {
                    Log.e(TAG, "onEvent: ", e );
                }
                else {

                    docID = queryDocumentSnapshots.getDocuments().get(itemposition).getId();
                    Log.d(TAG, "onEvent: DOC ID  = "   docID);

                    Intent intent;
                    intent = new Intent(context, UpdateNoteActivity.class);
                    intent.putExtra("id", docID);
                    context.startActivity(intent);                }
            }


        });
    }

    @Override
    public int getItemCount() {
        return notes.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        View mView;

        public TextView title_item;
        public TextView content_item;
        public CardView cardView;


        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            mView = itemView;
            context = itemView.getContext();

            title_item = itemView.findViewById(R.id.item_title);
            content_item = itemView.findViewById(R.id.item_content);
            cardView = itemView.findViewById(R.id.noteItem_card);

        }
    }


}
  

The UpdateNoteActivity.java обновляет значение документов. Но, как я уже сказал, когда я нажимаю кнопку возврата, действие снова открывается само. В любом случае, чтобы это исправить?

 package com.seeme;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.textfield.TextInputEditText;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;

import java.util.HashMap;

import javax.annotation.Nullable;

import butterknife.BindView;
import butterknife.ButterKnife;

public class UpdateNoteActivity extends AppCompatActivity {

    @BindView(R.id.content_editText)
    TextInputEditText content_editText;
    @BindView(R.id.capture_btn)
    FloatingActionButton captureBtn;
    @BindView(R.id.title_edittext)
    TextInputEditText titleEdittext;
    private FirebaseFirestore mFirestore;
    private FirebaseAuth mAuth;
    private FirebaseUser mUser;

    public String documentID;

    public static String TAG = "UpdateNoteActivity : ";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_update_note);
        ButterKnife.bind(this);

        documentID = getIntent().getStringExtra("id");

        mFirestore = FirebaseFirestore.getInstance();
        mAuth = FirebaseAuth.getInstance();
        mUser = mAuth.getCurrentUser();


        Toast.makeText(this, ""   documentID, Toast.LENGTH_SHORT).show();

        getDocDetails(documentID);
    }

    @Override
    public void onBackPressed() {

       // updateNote();
        super.onBackPressed();
     }

    @Override
    protected void onPause() {
        Toast.makeText(this, "PAUSED", Toast.LENGTH_SHORT).show();
        updateNote();
        super.onPause();
    }

    private void updateNote() {

        String string_title = titleEdittext.getText().toString();
        String string_content = content_editText.getText().toString();

        HashMap<String, Object> updateHash = new HashMap<>();
        updateHash.put("title", string_title);
        updateHash.put("content", string_content);

        mFirestore.collection("users").document(mUser.getUid()).collection("notes").document(documentID).update(updateHash)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Toast.makeText(UpdateNoteActivity.this, "UPDATED!", Toast.LENGTH_SHORT).show();
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.e(TAG, "onFailure: Update func ERROR", e );
                    }
                });

    }

    private void getDocDetails(String docID) {
        mFirestore.collection("users").document(mUser.getUid()).collection("notes").document(docID).addSnapshotListener(new EventListener<DocumentSnapshot>() {
            @Override
            public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    Log.e(TAG, "onEvent: ", e);
                } else {
                    String docTitle = documentSnapshot.get("title").toString();
                    String docContent = documentSnapshot.get("content").toString();

                    content_editText.setText(docContent);
                    titleEdittext.setText(docTitle);
                    Log.d(TAG, "onEvent: Document title = "   docTitle   "n Document Content = "   docContent);


                }
            }
        });
    }
}
  

Комментарии:

1. сколько раз onEvent: DOC ID выполняется печать в вашем logcat

2. @TejasPandya один раз за клик

Ответ №1:

onBackPressed повторно открывает действие из кэша. Если вы хотите обновить данные recyclerview, вам следует заново создать свое действие recycler. Используйте это, чтобы воссоздать действие вашего recycler при нажатии кнопки «Назад» в UpdateNoteActivity.java

  @Override
public void onBackPressed() {

   // Open your list activity with FLAG_ACTIVITY_CLEAR_TOP flag
   Intent mIntent = new Intent(UpdateNoteActivity.this, NoteListActivity.class); 
   mIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
   startActivity(mIntent);
   super.onBackPressed();
 }
  

Второй способ — вызвать startActivityForResult из вашего действия списка переработчиков и после успешного обновления вашей записи вызова setResult() с обновленным значением и обработать это значение в onActivityResult() вашем действии по переработке и обновить ваш список переработчиков.

Комментарии:

1. Пробовал использовать CLEAR_TOP и CLEAR_TASK. Также поиграл с файлом манифеста. Не повезло :/