FirebaseRecyclerAdapter иногда пуст, иногда показывает один элемент (самый последний), иногда он заполнен всеми элементами - PullRequest
0 голосов
/ 15 апреля 2019

Я новичок в Firebase. Я пытаюсь разработать приложение, которое будет отображать список звуковых сообщений в виде элементов на RecyclerView. Я хочу, чтобы пользователи моего приложения могли публиковать аудио-сообщения, чтобы другие пользователи могли слушать, комментировать, например, делиться и т. Д. Моя база данных имеет следующую структуру:

Database structure on Firebase

Когда пользователь создает сообщение, он / она направляется на свою стену, где он / она должен видеть все сделанные ранее сообщения, в том числе самую последнюю. Код для FirebaseRecyclerAdapter, который я поместил в метод onCreate() класса WallActivity.class, выглядит следующим образом:

    Query mRef = FirebaseDatabase.getInstance().getReference().child("users").child(FirebaseAuth.getInstance().getUid()).child("posts");

    RecyclerView recycler = (RecyclerView) findViewById(R.id.wall_recycler_view);

    recycler.setHasFixedSize(true);
    recycler.setLayoutManager(new LinearLayoutManager(this));

    FirebaseRecyclerOptions<Post> options =
            new FirebaseRecyclerOptions.Builder<Post>()
                    .setQuery(mRef,Post.class)
                    .build();
    adapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(options) {

        @NonNull
        @Override
        public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {


            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.post_layout, parent, false);


            return new PostViewHolder(view);
        }


        @Override
        protected void onBindViewHolder(@NonNull final PostViewHolder holder, final int position, @NonNull final Post model) {

            // Initialize media player
            mPlayer = new MediaPlayer();

            holder.comment.setText(model.comment);

            holder.btn_play.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // If media player another instance already running then stop it first
                    stopPlaying(mPlayer);

                    playMusic(model.getAudio(),mPlayer,holder.seekBar,holder.tv_pass, holder.tv_duration, holder.tv_due);


                }
            });

            holder.btn_stop.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    stopPlaying(mPlayer);
                }
            });

            holder.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

                @Override
                public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                    if(mPlayer!=null && b){

                        mPlayer.seekTo(i*1000);
                    }
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {

                }
            });

        }
    };


    recycler.setAdapter(adapter);

В моих onStart() и onStop() in есть следующий код:

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

    adapter.startListening();
}

@Override
protected void onStop() {
    super.onStop();

    adapter.stopListening();
}

Мой код класса ViewHolder выглядит следующим образом:

    private class PostViewHolder extends RecyclerView.ViewHolder {

    LinearLayout root;
    RelativeLayout relativeLayout;
    LinearLayout linearLayout;
    TextView comment, tv_pass, tv_due, tv_duration;
    SeekBar seekBar;
    Button btn_play, btn_stop;


    private PostViewHolder(View itemView) {
        super(itemView);

        root = (LinearLayout) itemView.findViewById(R.id.list_root);

        relativeLayout = (RelativeLayout) root.findViewById(R.id.rlp);
        linearLayout = (LinearLayout) root.findViewById(R.id.llp);
        comment = (TextView)root.findViewById(R.id.tv_cmt);

        tv_pass = (TextView) relativeLayout.findViewById(R.id.tv_pass);
        tv_due = (TextView) relativeLayout.findViewById(R.id.tv_due);
        tv_duration = (TextView) relativeLayout.findViewById(R.id.tv_duration);
        seekBar = (SeekBar) relativeLayout.findViewById(R.id.seek_bar);

        btn_play = (Button) linearLayout.findViewById(R.id.btn_play);
        btn_stop = (Button) linearLayout.findViewById(R.id.btn_stop);
    }
}

Примечание:

  • Когда я получаю доступ к WallActivity.class из другого действия, используя Intent, иногда он пуст. Иногда я получаю только самый последний пост, который был создан, а иногда он полон всего поста. Чтобы упростить процесс отладки, я сделал это действие средством запуска, и все, что я получаю, это пустой RecyclerView.
  • Я не закончил писать свой код, поэтому для кнопки Like нет Поделитесь, комментируйте как вы ожидаете. Я хотел бы завершить «получить аудио из FirebaseStorage и воспроизвести его» перед тем, как кодировать логику для этих кнопок.
...