Ссылка на нулевой объект в списке - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть список, который используется двумя отдельными классами. Однако мне нужно, чтобы этот список был определен в одном из моих методов onDataChange, и это вызывает у меня некоторые проблемы. В начале моего класса мой список определен так:

public List<String> openGames;

У меня есть это, так что мой класс RecyclerView может использовать его. Затем я инициализирую свой список в методе onDataChange, как этот

    public void updateUI(final ListCallback callBack) {
    FCGames.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            numGames = (int) dataSnapshot.getChildrenCount();

            openGames = new ArrayList<>();
            .
            .
            .

Эти точки есть лишь для того, чтобы сказать, что кода больше, но я не думаю, что это необходимо для этой проблемы.

В классе MyRecyclerViewer этот список используется, и при открытии Activity он пытается получить размер списка следующим образом:

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

Но так как список не определен до тех пор, пока в моем приложении не произойдут некоторые вещи, например, вызывается метод onDataChange, это вызывает ошибку:

Попытка вызова метода интерфейса 'int java.util.List.size ()' для ссылки на пустой объект

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

Итак, я попытался обойти это, добавив проверку нулевого размера списка, когда он принимает размер списка, и это избавляет от ошибки, но из-за этого весь мой RecyclerViewer вообще не работает

Есть ли обходной путь для этого?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Вы должны выполнить public List<String> openGames = new ArrayList<>(); инициализацию в поле.

И настройте адаптер RecyclerView вне вызова Firebase.

В обратном вызове Firebase не создавайте новый список. Вместо этого используйте openGames.clear(), чтобы очистить его перед добавлением новых данных, что сохранит экземпляр списка, который использует RecyclerView.

При этом вы все равно должны вызывать методы уведомления адаптера, чтобы пользовательский интерфейс знал, что данные изменились, что, как я полагаю, вам не хватает, если RecyclerView "не работает"


Если вы хотите получать изменения данных, как они происходят в Firebase, вы используете неправильный метод

... метод addListenerForSingleValueEvent() ... срабатывает один раз, а затем не запускается снова.

Вам нужно будет использовать addValueEventListener

0 голосов
/ 03 ноября 2018

Вам необходимо проверить, не равен ли ваш список NULL, чтобы получить его размер.

@Override
public int getItemCount() {
    return mData != null ? mData.size() : 0;
}
...