Uczę się pracować z fragmentami i wczoraj próbowałem wykonać Recyclerview z fragmentami i wypełnić je danymi z Firebase. Jestem w 95% pewien, że zadziałało wczoraj, ponieważ przetestowałem go i pokazywał mi dane. Jednak dzisiaj, gdy próbowałem uruchomić moją aplikację, nie wyświetlała ona żadnych danych, a jedynie pusty ekran.

Zrobiłem dzisiaj migrację na androidx czy to może być problem?

public class EventListFragment extends Fragment {

    private static final String TAG = "EventListFragment";

    private View listItemView;
    private RecyclerView myItemList;
    private DatabaseReference databaseReference;
    private FirebaseRecyclerOptions<Event> options;
    private FirebaseAuth mAuth;
    private String currentUserID;

    public EventListFragment(){

    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        listItemView = inflater.inflate(R.layout.fragment_events_list,container,false);

        myItemList = listItemView.findViewById(R.id.item_list);
        myItemList.setLayoutManager(new LinearLayoutManager(getContext()));

        mAuth = FirebaseAuth.getInstance();
        currentUserID = mAuth.getCurrentUser().getUid();
        databaseReference = FirebaseDatabase.getInstance().getReference().child("events");

        return listItemView;
    }

    @Override
    public void onStart() {
        super.onStart();

        options = new FirebaseRecyclerOptions.Builder<Event>()
                .setQuery(databaseReference, Event.class)
                .build();

        FirebaseRecyclerAdapter<Event, EventViewHolder> adapter
                = new FirebaseRecyclerAdapter<Event, EventViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull EventViewHolder eventViewHolder, int i, @NonNull Event event) {
                eventViewHolder.eventName.setText(event.getName());
                eventViewHolder.eventDate.setText(event.getDate());
                eventViewHolder.eventOrganisator.setText(event.getOrganisator());

                Log.d(TAG, "onBindViewHolder: " + event.getName());
            }

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

        myItemList.setAdapter(adapter);
        adapter.startListening();
    }
}

EventViewHolder

public class EventViewHolder extends ViewHolder {

    public TextView eventName;
    public TextView eventOrganisator;
    public TextView eventDate;

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

        eventName = itemView.findViewById(R.id.eventName);
        eventOrganisator = itemView.findViewById(R.id.eventOrganisator);
        eventDate = itemView.findViewById(R.id.eventDate);
    }
}

EventListActivity

public class EventListActivity extends FragmentActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_event_list);

        EventListFragment fragment = new EventListFragment();
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.event_list_placeholder, fragment);
        fragmentTransaction.commit();


    }
}

O ile wiem, wydaje mi się, że jest to w porządku i powinno działać. Kiedy uruchamiam aplikację, nie zawiesza się ani nie wyświetla błędów, więc naprawdę nie wiem, gdzie szukać możliwych problemów.

0
Vito Mastroianni 20 listopad 2019, 18:51

1 odpowiedź

Zgaduję, że śledzisz jakiś samouczek. Znalazłem taki, który był podobny i po przejrzeniu może to być problem.

Aby wyrejestrować adapter Firebase, musisz dodać odbiornik w onStop. Dodaj to do EventListFragment.

@Override
protected void onStop() {
    super.onStop();
    adapter.stopListening();
} 
0
M. Hig 21 listopad 2019, 03:49
Dzięki za odpowiedź, już tego próbowałem i uzyskałem ten sam wynik. Dzięki za link do tutoriala sprawdzę to.
 – 
Vito Mastroianni
21 listopad 2019, 16:13