При попытке вывести данные из 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;
}}
У Вас адаптер объявлен как локальная переменная внутри метода onCreateView()
. При обращении из updateList()
он видит другой адаптер, которому Вы не присвоили значение. Исправьте это место:
...
adapter = new DirectionAdapter(directionList);
recyclerView.setAdapter(adapter);
...
Т.к. Вы создате повторно объект DirectionAdapter
, то первый, который объявлен в классе, соответственно, равен null
. Надеюсь, что это просто невнимательность.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Интересно, как грамотнее писать проверку на то, что коллекция не пустая, следуя принципу чистого кода?
Я искал как сделать запись происходящего на экране AndroidНашел, вот на сайте
В официальном Android API написано следующее: