Нужно прокрутить на реселлер, чтобы увидеть предметы - PullRequest
0 голосов
/ 31 августа 2018

Я написал приложение для заметок. Там вы можете видеть свои заметки, редактировать их и удалять их, проводя. При запуске приложения все работает нормально, пока я не добавлю новую заметку. После создания новой заметки и возврата в MainActivity элементы в окне повторного использования невидимы. Затем я должен прокручивать окно повторного просмотра, чтобы элементы снова стали видны. Отныне даже удаление элемента приводит к появлению невидимых элементов. Здесь - это видео (видео записывается после добавления новой заметки - после удаления предметы становятся невидимыми, и вы должны прокрутить просмотр в утилизаторе, чтобы получить их обратно). Странная вещь, прежде чем я создаю новую заметку, все работает. Так может быть что-то не так с моим firestorelistener или моим ArrayList?

код основной деятельности:

public class MainActivity extends AppCompatActivity implements RecyclerItemTouchHelper.RecyclerItemTouchHelperListener {

private FirebaseFirestore db;

private RecyclerView recyclerView;
private RecyclerView.LayoutManager recyclerViewLayoutManager;
private FirestoreRecyclerAdapter adapter;
private List<Note> notesList;

private ListenerRegistration firestoreListener;

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

    recyclerView = findViewById(R.id.rvNoteList);
    db = FirebaseFirestore.getInstance();

    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.addItemDecoration(new com.raycroud.notes.notes.utils.DividerItemDecoration(MainActivity.this, LinearLayoutManager.VERTICAL, 16));
    recyclerView.setAdapter(adapter);

    ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new RecyclerItemTouchHelper(0, ItemTouchHelper.LEFT, MainActivity.this);
    new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);

    loadNotesList();

    notesList = new ArrayList<>();

    firestoreListener = db.collection("users").document(firebase_user_uid).collection("notes")
            .addSnapshotListener(new EventListener<QuerySnapshot>() {
                @Override
                public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
                    if (e != null) {
                        Log.e("LOL", "Listen failed!", e);
                        return;
                    }

                    notesList.clear();

                    for (DocumentSnapshot doc : documentSnapshots) {
                        Note note = doc.toObject(Note.class);
                        note.setId(doc.getId());
                        notesList.add(note);
                    }

                    adapter.notifyDataSetChanged();
                }
            });
}

private void loadNotesList() {

    Query query = db.collection("users").document(firebase_user_uid).collection("notes");

    FirestoreRecyclerOptions<Note> response = new FirestoreRecyclerOptions.Builder<Note>()
            .setQuery(query, Note.class)
            .build();

    adapter = new FirestoreRecyclerAdapter<Note, NoteViewHolder>(response) {
        @Override
        protected void onBindViewHolder(NoteViewHolder holder, int position, Note model) {
            final Note note = notesList.get(position);

            holder.title.setText(note.getTitle());
            holder.content.setText(note.getContent());
            Glide.with(MainActivity.this).load(note.getNote_image_url()).into(holder.bg_note_image);

            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    updateNote(note);
                }
            });
        }

        @Override
        public NoteViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_note_view, parent, false);
            return new NoteViewHolder(view);
        }

        @Override
        public void onError(FirebaseFirestoreException e) {
            Log.e("error", e.getMessage());
        }
    };

    adapter.notifyDataSetChanged();
    recyclerView.setAdapter(adapter);
}

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position) {
    if (viewHolder instanceof NoteViewHolder) {
        int pos = viewHolder.getAdapterPosition();
        String name = notesList.get(pos).getTitle();
        String id = notesList.get(pos).getId();

        // backup of removed item for undo purpose
        final Note deletedItem = notesList.get(viewHolder.getAdapterPosition());
        final int deletedIndex = viewHolder.getAdapterPosition();

        // remove the item from recycler view
        deleteNote(id);

        Snackbar snackbar = Snackbar.make(coordinatorLayout, name + " removed from cart!", Snackbar.LENGTH_LONG);
        snackbar.setAction("UNDO", new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // undo is selected, restore the deleted item
            }
        });
        snackbar.setActionTextColor(Color.YELLOW);
        snackbar.show();
    }
}

private void deleteNote(String id) {
    db.collection("users").document(firebase_user_uid).collection("notes")
            .document(id)
            .delete()
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    mFirebaseAnalytics.logEvent(NOTE_DELETED_EVENT, null);
                }
            });
}

@Override
public void onStart() {
    super.onStart();
    adapter.startListening();
}

@Override
public void onStop() {
    super.onStop();
    adapter.stopListening();
}}  

1 Ответ

0 голосов
/ 02 сентября 2018

Так что, по крайней мере, я исправил свой собственный ответ. Я переписал свой код. Поэтому, когда я посмотрел на https://github.com/firebase/FirebaseUI-Android/blob/master/firestore/README.md#using-the-firestorerecycleradapter, я заметил, что мне не нужно создавать собственный ArrayList. После удаления этого списка и написания кода, как в примере с firebase, он заработал.
Но спасибо за вашу помощь.

...