1

我有下面的 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); }
    }
}
4

2 回答 2

0

没有经过真正的测试,但是,您可以尝试在声音停止播放时添加回调,如下所示:

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();
    }
于 2020-08-02T17:47:38.657 回答
0

我所做的与@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;
于 2020-08-04T08:55:09.817 回答