Когда звук перестает воспроизводиться, открывать другое занятие - PullRequest
1 голос
/ 02 августа 2020

У меня есть адаптер для RecyclerView ниже.
Есть определенные звуки, связанные с каждым элементом RecyclerView, как вы можете видеть.
Как заставить элемент ждать, пока соответствующий звук не закончит воспроизведение?
В настоящее время, когда При щелчке по элементу RecyclerView происходит немедленный переход к предполагаемому действию, не дожидаясь окончания воспроизведения звука.

Итак, это должна быть строка:
1. Пользователь нажимает на элемент RecyclerView.
2. Начнется воспроизведение соответствующего звука.
3. Звук заканчивается.
4. Начнется новое действие.

Адаптер

public class RvAdapter extends RecyclerView.Adapter<RvAdapter.ViewHolder> {
    RecyclerView.Adapter.StateRestorationPolicy PREVENT_WHEN_EMPTY;
    private String[] titles = {"Topic1","Topic2","Topic3","Topic4","Topic5","Topic6","Topic7","Topic8","Topic9","Topic10"};
    private ArrayList<Item> items;
    private Context context;
    public RvAdapter(ArrayList<Item> items, Context context) { this.items = items; this.context = context; }
    MediaPlayer main_mp;

    @NonNull
    @Override
    public RvAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent,false);
        return new ViewHolder(view); }

    @Override
    public void onBindViewHolder(@NonNull RvAdapter.ViewHolder holder, final int position) {
        releaseMediaPlayer();
        final Item item = items.get(position);
        holder.imageView.setImageResource(item.getImageResource());
        holder.textView.setText(titles[position]);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) { releaseMediaPlayer();
                Context context = RvAdapter.this.context;
                final Intent intent;
                switch (position){
                    case 0: setupMediaPlayer(R.raw.topic1sound); intent = new Intent(context, Topic1.class); break;
                    case 1: setupMediaPlayer(R.raw.topic2sound); intent = new Intent(context, Topic2.class); break;
                    case 2: setupMediaPlayer(R.raw.topic3sound); intent = new Intent(context, Topic3.class); break;
                    case 3: setupMediaPlayer(R.raw.topic4sound); intent = new Intent(context, Topic4.class); break;
                    case 4: setupMediaPlayer(R.raw.topic5sound); intent = new Intent(context, Topic5.class); break;
                    case 5: setupMediaPlayer(R.raw.topic6sound); intent = new Intent(context, Topic6.class); break;
                    case 6: setupMediaPlayer(R.raw.topic7sound); intent = new Intent(context, Topic7.class); break;
                    case 7: setupMediaPlayer(R.raw.topic8sound); intent = new Intent(context, Topic8.class); break;
                    case 8: setupMediaPlayer(R.raw.topic9sound); intent = new Intent(context, Topic9.class); break;
                    case 9: setupMediaPlayer(R.raw.topic10sound); intent = new Intent(context, Topic10.class); break;
                    default: throw new IllegalStateException("Unexpected value: " + position);
                } context.startActivity(intent);
            }
        });
    }

    @Override
    public int getItemCount() { return items.size(); }
    public void setupMediaPlayer(int resource) {main_mp = MediaPlayer.create(context, resource); main_mp.start();}
    public void releaseMediaPlayer(){if (main_mp != null) { main_mp.stop(); main_mp.release(); main_mp = null; }}

    public static class ViewHolder extends RecyclerView.ViewHolder { ImageView imageView; TextView textView;
        public ViewHolder(@NonNull final View itemView) { super(itemView);
            imageView = itemView.findViewById(R.id.titleImageView);
            textView = itemView.findViewById(R.id.titleTextView); }
    }
}

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Я сделал немного не то, что предлагал @Luciano, и моя проблема теперь решена.
Я добавил OnCompletionListener() для каждого Switch case, как показано ниже.

case 0: setupMediaPlayer(R.raw.Topic1);
    main_mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) { Intent intent = new Intent(context,Topic1.class); context.startActivity(intent); }
    });
break;
0 голосов
/ 02 августа 2020

На самом деле не тестировалось, но вы можете попробовать добавить обратный вызов, когда звук перестает воспроизводиться, например:

public void setupMediaPlayer(int resource, Class<? extends Activity> activityClass) {
        main_mp = MediaPlayer.create(context, resource);
        main_mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                context.startActivity(new Intent(context, activityClass));
            }
        });
        main_mp.start();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...