Я новичок в Firebase. Я пытаюсь разработать приложение, которое будет отображать список звуковых сообщений в виде элементов на RecyclerView
. Я хочу, чтобы пользователи моего приложения могли публиковать аудио-сообщения, чтобы другие пользователи могли слушать, комментировать, например, делиться и т. Д. Моя база данных имеет следующую структуру:
Когда пользователь создает сообщение, он / она направляется на свою стену, где он / она должен видеть все сделанные ранее сообщения, в том числе самую последнюю. Код для 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 и воспроизвести его» перед тем, как кодировать логику для этих кнопок.