Не подгружаются данные с Firebase

280
16 ноября 2017, 02:32

При попытке вывести данные из Firebase выдается ошибка. В чем может быть проблема? P.S. Если вручную формировать данные, то все работает.

Лог ошибок:

`FATAL EXCEPTION: main Process: com.example.gukov.guap, PID: 3760 java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.gukov.guap.DirectionAdapter.notifyDataSetChanged()' on a null object reference

at com.example.gukov.guap.SearchFragment$1.onChildAdded(SearchFragment.java:122)

Код адаптера DirectionAdapter:

public class DirectionAdapter extends RecyclerView.Adapter<DirectionAdapter.DirectionViewHolder> {
private List<Direction> directionList;
public DirectionAdapter(List<Direction> directionList) {
    this.directionList = directionList;
}
@Override
public DirectionViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new DirectionViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.direction, parent, false));
}
@Override
public void onBindViewHolder(DirectionViewHolder holder, int position) {
    Direction direction = directionList.get(position);
    holder.textViewDirectionTitle.setText(direction.directionTitle);
    holder.textViewDirectionCount.setText(direction.directionCount);
}
@Override
public int getItemCount() {
    return directionList.size();
}
class DirectionViewHolder extends RecyclerView.ViewHolder {
    TextView textViewDirectionTitle, textViewDirectionCount;
    public DirectionViewHolder(View itemView) {
        super(itemView);

        textViewDirectionTitle = itemView.findViewById(R.id.textViewDirectionTitle);
        textViewDirectionCount = itemView.findViewById(R.id.textViewDirectionCount);
    }
}}

Код Direction:

public class Direction {
String directionCount;
String directionTitle, key;
public Direction() {
}
public Direction(String directionCount, String directionTitle, String key) {
    this.directionCount = directionCount;
    this.directionTitle = directionTitle;
    this.key = key;
}}

Код SearchFragment:

public class SearchFragment extends Fragment implements View.OnClickListener {
RecyclerView recyclerView;
DirectionAdapter adapter;
List<Direction> directionList;
private FirebaseAuth mAuth;
private FirebaseDatabase database;
private DatabaseReference myRef;
private FirebaseUser user;
public SearchFragment() {
    // Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // инициализация FirebaseAuth
    mAuth = FirebaseAuth.getInstance();
    user = mAuth.getInstance().getCurrentUser();
    database = FirebaseDatabase.getInstance();
    myRef = database.getReference("directions");

    View rootView = inflater.inflate(R.layout.fragment_search, container, false);
    FloatingActionButton fabAdd = (FloatingActionButton) rootView.findViewById(R.id.fabAdd);
    fabAdd.setOnClickListener(this);

    directionList = new ArrayList<>();
    recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    LinearLayoutManager lim = new LinearLayoutManager(getActivity().getApplication().getApplicationContext());
    lim.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(lim);

    DirectionAdapter adapter = new DirectionAdapter(directionList);
    recyclerView.setAdapter(adapter);
    updateList();

    return rootView;
}
//если вручную заполнить
//    private void createResult() {
//
//        for (int i = 0; i < 10; i++) {
//            directionList.add(new Direction("title","key","12"));
//        }
//    }
@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.fabAdd:
            Intent intent = new Intent(getContext(), AddMeetActivity.class);
            startActivity(intent);
            break;
        default:
            break;
    }
}
// Проверка, залогинен ли уже текущий пользователь
@Override
public void onStart() {
    super.onStart();
    FirebaseUser currentUser = mAuth.getCurrentUser();
    updateUI(currentUser);
}
// обновление пользовательского интерфейся
private void updateUI(FirebaseUser user) {
    if (user != null) {
        //
    } else {
        getActivity().findViewById(R.id.fabAdd).setVisibility(View.GONE);
    }
}
private void updateList() {
    myRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            directionList.add(dataSnapshot.getValue(Direction.class));
            adapter.notifyDataSetChanged();
        }
        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            Direction model = dataSnapshot.getValue(Direction.class);
            int index = getItemIndex(model);
            directionList.set(index, model);
            adapter.notifyItemChanged(index);
        }
        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            Direction model = dataSnapshot.getValue(Direction.class);
            int index = getItemIndex(model);
            directionList.remove(index);
            adapter.notifyItemRemoved(index);
        }
        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}
private int getItemIndex(Direction direction) {
    int index = -1;
    for (int i= 0; i < directionList.size(); i++) {
        if (directionList.get(i).key.equals(direction.key)) {
            index = i;
            break;
        }
    }
    return index;
}}
Answer 1

У Вас адаптер объявлен как локальная переменная внутри метода onCreateView(). При обращении из updateList() он видит другой адаптер, которому Вы не присвоили значение. Исправьте это место:

...
adapter = new DirectionAdapter(directionList);
recyclerView.setAdapter(adapter);
...

Т.к. Вы создате повторно объект DirectionAdapter, то первый, который объявлен в классе, соответственно, равен null. Надеюсь, что это просто невнимательность.

READ ALSO
Как лучше читается проверка на не пустую коллекцию?

Как лучше читается проверка на не пустую коллекцию?

Интересно, как грамотнее писать проверку на то, что коллекция не пустая, следуя принципу чистого кода?

252
Java Android. Работа в фоновом режиме. Класс Surface

Java Android. Работа в фоновом режиме. Класс Surface

Я искал как сделать запись происходящего на экране AndroidНашел, вот на сайте

247
&ldquo;Стрим&rdquo; экрана (демонстрация экрана). Android API: MediaProjection

“Стрим” экрана (демонстрация экрана). Android API: MediaProjection

В официальном Android API написано следующее:

314
Получение поля SET из БД в java

Получение поля SET из БД в java

Как получить поле типа SET из БД mysql в java?

246