OnCreateViewHolder не вызывается в FirebaseRecyclerAdapter

Управление выполнением, похоже, не входит в onCreateViewHolder; данные не отображаются на экране. Похоже, что onStart и onBindViewHolder вызываются, но не onCreateViewHolder.

Я пробовал много вещей, пытался найти решение в течение 2 дней. У меня есть: 1. Удаление setHasFixdSize(true) не помогло

  1. Добавление setHasFixedSize(false) тоже не сработало

  2. Преобразование относительного макета в макет кадра и наоборот.

  3. Деградация всех зависимостей firebase и использование метода populateview. тоже не работал

  4. Удаление всех данных из firebase тоже не помогло.
  5. Раньше у меня был адаптер внутри onStart, теперь он у меня есть в onCreate
  6. Перепечатал весь мой код, надеясь, что он сработает, но это не сработало.

UsersActivity.java

Важные декларации:

private RecyclerView usersList;
private DatabaseReference mUsersDatabase;
private FirebaseRecyclerAdapter<Users, UserHolders> firebaseRecyclerAdapter;

в onCreate:

usersList = (RecyclerView) findViewById(R.id.user_list);
usersList.setHasFixedSize(false);
usersList.setLayoutManager(new LinearLayoutManager(this));

DatabaseReference userRef = FirebaseDatabase.getInstance().getReference().child("Users");

FirebaseRecyclerOptions<Users> options = new FirebaseRecyclerOptions.Builder<Users>()
    .setQuery(userRef, Users.class)
    .build();

firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Users, UserHolders>(options) {
    @Override
    protected void onBindViewHolder(UserHolders holder, int position, Users model) {
        holder.userName.setText(model.getName());
        holder.userStatus.setText(model.getImage());
        Picasso.get().load(model.getImage()).into(holder.userProfile);
        Toast.makeText(UsersActivity.this, "working onBind", Toast.LENGTH_SHORT).show();
    }

    @Override
    public UserHolders onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.users_single_layout, viewGroup, false);
        UserHolders userHolders = new UserHolders(view);
        Toast.makeText(UsersActivity.this, "working onCreate", Toast.LENGTH_SHORT).show();
        return userHolders;
    }
};
usersList.setAdapter(firebaseRecyclerAdapter);

в onStart()

super.onStart();
Toast.makeText(this, "onStart being called", Toast.LENGTH_SHORT).show();
firebaseRecyclerAdapter.startListening();  

в onStop()

super.onStop();
firebaseRecyclerAdapter.stopListening();

Класс ViewHolder:

public static class UserHolders extends RecyclerView.ViewHolder {
    TextView userName, userStatus;
    CircleImageView userProfile;

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

        userName = itemView.findViewById(R.id.user_single_name);
        userProfile = itemView.findViewById(R.id.user_single_image);
        userStatus = itemView.findViewById(R.id.user_single_status);
    }
}

Класс модели

public class Users {

    public String name;
    public String image;
    public String status;

    public Users(){}

    public Users(String name, String image, String status) {
        this.name = name;
        this.image = image;
        this.status = status;}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

    public String getImage() {return image;}

    public void setImage(String image) {this.image = image;}

    public String getStatus() {return status;}

    public void setStatus(String status) {this.status = status;}
}

Зависимости от Firebase:

implementation 'com.google.firebase:firebase-database:16.1.0'
implementation 'com.google.firebase:firebase-storage:16.1.0'
implementation 'com.google.firebase:firebase-auth:16.1.0'
implementation 'com.firebaseui:firebase-ui-database:4.3.2'

Поэтому я ожидал, что все всплывающие уведомления будут работать нормально, указывая на то, что полный код действительно компилируется. Тосты внутри onBindViewHolder и onStart вызываются, но не внутри onCreateViewHolder.

Итак, структура данных следующая

teteatete-c08f9
-Users
  -FxFcc..............
       .- image
       .- name
       .- status
       .- thumb_image

Я проверил, что переменные класса модели имеют то же имя, что и эти поля.

Вы забыли поставить return size в RecyclerView.Adapter в `getItemCount()`?

Nick Bapu 14.05.2019 09:57

@NickBapu Я не знал, что мы должны вернуть размер. в документации такого нет

Rishabh 14.05.2019 09:59

@NickBapu, не могли бы вы рассказать мне, как это сделать? И при чем тут размер?

Rishabh 14.05.2019 10:00

Пожалуйста, добавьте структуру вашей базы данных в виде файла JSON или хотя бы в виде снимка экрана.

Alex Mamo 14.05.2019 10:02

Где находится ваш класс адаптера. Мне нужно это увидеть. Если вы используете какой-либо список, вам нужно вернуть его размер, например: public int getItemCount() { return arrayList.size(); } this.

Nick Bapu 14.05.2019 10:03

@NickBapu, это код, который у меня есть. Там включено объявление FirebaseREcyclerAdapter.

Rishabh 14.05.2019 10:05

Иди и измени свои правила в консоли firebase

Rishabh 19.05.2019 19:17
1
7
235
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

ваш код кажется идеальным. Вы проверили правила в консоли Firebase? Превратите их из ложных в истинные. Перейдите в свою базу данных реального времени в Firebase, а затем в правилах замените false на true. Тогда это должно работать.

Я запустил тот же код. В моем приложении, и это сработало. Я новичок в StackOverflow, не знаю, что нужно комментировать, а что нет.

Rishabh 19.05.2019 19:12

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