Элементы recyclerview становятся невидимыми после возобновления действия

похоже, что ни у кого больше нет этой проблемы, потому что я не нашел на это ответа. Моя проблема в том, что recyclerview не показывает свои элементы после возобновления активности во второй раз. Чтобы элементы снова стали видны, я должен щелкнуть или прокрутить любое место в recyclerview. Я действительно не знаю, невидимы ли элементы, список заметок пуст или есть другие проблемы. Может дело только в структуре. Я не уверена. Вот фрагмент моего кода:
Основное занятие:

public class MainActivity extends AppCompatActivity implements RecyclerItemTouchHelper.RecyclerItemTouchHelperListener, NoteListAdapter.NotesAdapterListener {

private FirebaseAnalytics mFirebaseAnalytics;
private FirebaseAuth mFirebaseAuth;
public FirebaseUser mFirebaseUser;
private FirebaseFirestore db;

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

private ListenerRegistration firestoreListener;
private RecyclerItemTouchHelper.RecyclerItemTouchHelperListener listener;

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

    mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
    mFirebaseAuth = FirebaseAuth.getInstance();
    mFirebaseUser = mFirebaseAuth.getInstance().getCurrentUser();
    db = FirebaseFirestore.getInstance();

    recyclerView = findViewById(R.id.rvNoteList);
}

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

@Override
protected void onResume() {
    super.onResume();

    notesList = new ArrayList<>();

    FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder().setPersistenceEnabled(true).build();
    db.setFirestoreSettings(settings);

    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 NoteListAdapter(notesList, response, MainActivity.this, MainActivity.this);

    recyclerViewLayoutManager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false);
    recyclerView.setLayoutManager(recyclerViewLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.addItemDecoration(new CustomRecyclerViewDivider(this, LinearLayoutManager.VERTICAL, 16));

    recyclerView.setAdapter(adapter);

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

    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;
                    }

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

    recyclerView.addOnItemTouchListener(new RecyclerViewTouchListener(getApplicationContext(), recyclerView, new RecyclerViewTouchListener.ClickListener() {
        @Override
        public void onClick(View view, int position) {
            if (notesList != null || notesList.size() <= 0) {
                Note note = notesList.get(position);
                updateNote(note);
            }
        }

        @Override
        public void onLongClick(View view, int position) {

        }
    }));

    adapter.startListening();
    setAlarms();

    invalidateOptionsMenu();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);

    View headerView = navigationView.getHeaderView(0);
    navUsername = (TextView) headerView.findViewById(R.id.displayname);
    navEmail = (TextView) headerView.findViewById(R.id.email);

    username  = sharedPreferences.getString("display_name", "");
    email = sharedPreferences.getString("email", "");

    if (username == null || email == null  || username.isEmpty() || email.isEmpty()) {
        email = mFirebaseUser.getEmail().toString();
        sharedPreferences.edit().putString("email", email).apply();
    }

    navUsername.setText(username);
    navEmail.setText(email);
}}  

А когда Activity создает?

ʍѳђઽ૯ท 28.08.2018 16:44

@ ʍѳђ ઽ ૯ ท Да, отлично.

marcelo.wdrb 28.08.2018 16:44

@ ʍѳђ ઽ ૯ ท К сожалению, это не работает. Все еще такая же проблема. Может быть, мне не следует загружать список заметок не каждый раз, когда я возобновляю действие? Но когда я это сделаю, у меня будет проблема, которая у меня была раньше: stackoverflow.com/questions/52056917/…

marcelo.wdrb 28.08.2018 16:55

Вопрос в том ... зачем вам нужно перезагружать данные каждый раз, когда снова появляется Activity? Firebase - это база данных в реальном времени - вы можете получать снимки, когда данные были изменены.

Barns 28.08.2018 16:57

@Barns Мне не нужно загружать элементы каждый раз, когда они новые. Пожалуйста, посмотрите мой вопрос за несколько часов до этого: stackoverflow.com/questions/52056917/… Эти ребята сказали, что я должен делать все с Firebase в onResume вместо onCreate. И это сработало (приложение больше не падало после возобновления активности). Но теперь у меня есть эта проблема.

marcelo.wdrb 28.08.2018 17:45

В вашем коде многое, я думаю, вам следует переосмыслить (перепроектировать). Но есть также некоторый код, который отсутствует - Где определены методы adapter.startListening() и adapter.stopListening()? Что они делают? Что такое updateNote(note). Почему вы дважды добавили MainActivity.this в конструктор Adapter :: adapter = new NoteListAdapter(notesList, response, MainActivity.this, MainActivity.this);? И как я сказал ранее - Firebase - это БД реального времени. Пусть делает свою работу.

Barns 28.08.2018 18:41

@Barns adapter.startListening() и adapter.stopListening () - это методы из firebase. Функция updateNote (note) не важна для ошибки возобновления. Ммм, да я заменю Адаптер, что будет только разовый MainActivity.this. Но, к сожалению, это не решило мою проблему.

marcelo.wdrb 28.08.2018 18:47

«... Адаптер, что это будет только один раз MainActivity.this. Но, к сожалению, это не решило мою проблему.» Я никогда не говорил, что это решит вашу проблему, но чистый код помогает отслеживать проблемы.

Barns 28.08.2018 19:19

@Barns Хорошо, но я все равно благодарю вас за вашу помощь. :)

marcelo.wdrb 28.08.2018 19:27
1
9
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте следующие коды. Поместите recyclerView.setAdapter(adapter);notifyDataSetChanged() после) внутри runOnUiThread() (или где бы вы ни обновляли-меняли или выполняли что-то на Adapter):

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        //Do something on UiThread

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

Поскольку это влияет на изменение пользовательского интерфейса, я смог показать это таким образом с помощью метода runOnUiThread().

@ marcelo.wdrb Вам следует еще раз взглянуть на коды из образца: stackoverflow.com/a/52057174/4409113 кажется, что есть несколько вещей (например, метод onStart(), if (adapter != null) и т. д.), которые вы должны сначала рассмотреть, а затем попытаться сделать с ним другие вещи.

ʍѳђઽ૯ท 28.08.2018 21:36

Спасибо за вашу помощь.:)

marcelo.wdrb 31.08.2018 18:57

Другие вопросы по теме