RecyclerView + MediaPlayer +切换按钮+字符串Uri [英] RecyclerView + MediaPlayer + Toggle Button + String Uri

查看:93
本文介绍了RecyclerView + MediaPlayer +切换按钮+字符串Uri的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

背景:我正在开发Fitness应用.到目前为止一切正常,但是当我在android中使用音频文件MediaPlayer时出现了问题.

Background: I'm working on an Fitness app. Everything is working good till now but problem came when I was working with audio files MediaPlayer in android.

我检查了资源并找到了ListView,但是在RecyclerView + MediaPlayer上找不到任何内容.

I have checked resources and found ListView but couldn't find anything on RecyclerView + MediaPlayer.

我想知道如何在使用RecyclerView +切换按钮+字符串Uri(脱机-原始文件夹)时使其工作

I want to know how to make it work while working with RecyclerView + Toggle Button + String Uri (Offline - Raw folder)

问题:现在,它正在每个点击事件中播放第一个.mp3文件(对于Eng: R.raw.sample_one_eng 而言,对于印地语: R.raw.sample_one_hindi 播放).我认为它没有考虑到int位置.

Problem: Right now it is playing the first .mp3 file on every click event (for Eng: R.raw.sample_one_eng is played and for Hindi: R.raw.sample_one_hindi is played). I think it is not taking int position into consideration.

稍后,我想将其在线(可能是Google云),因为音频文件(.mp3)使我的应用变得很沉重.对此的任何想法也将不胜感激(快速缓冲等).

Later, I would like to put it online (may be google cloud) since audio files (.mp3) are making my app quite heavy. Any ideas on that would be appreciated too (fast buffering, etc.).

ListExercises.java

public class ListExercises extends AppCompatActivity {

    List<ExerciseAudio> exerciseList = new ArrayList<>();
    RecyclerView.LayoutManager layoutManager;
    RecyclerView recyclerView;
    RecyclerViewAdapterAud adapter;
    PlayClickHandler clickHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_exercises);

        initData();

        recyclerView = (RecyclerView) findViewById(R.id.list_ex);
        adapter = new RecyclerViewAdapterAud(exerciseList, getBaseContext());
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapter);
    }

    private void initData() {

        exerciseList.add(new ExerciseAudio(R.drawable.sample_one, "Sample Exercise One", "Sans One",
                R.raw.sample_one_eng,
                R.raw.sample_one_hindi));

        exerciseList.add(new ExerciseAudio(R.drawable.sample_two, "Sample Exercise Two", "Sans Two",
                R.raw.sample_two_eng,
                R.raw.sample_two_hindi));

        exerciseList.add(new ExerciseAudio(R.drawable.sample_three, "Sample Exercise Three", "Sans Three",
                R.raw.sample_three_eng,
                R.raw.sample_three_hindi));

        exerciseList.add(new ExerciseAudio(R.drawable.sample_four, "Sample Exercise Four", "Sans Four",
                R.raw.sample_four_eng,
                R.raw.sample_four_hindi));
    }
}

ViewExercise.java

public class ViewExercise extends AppCompatActivity {

    int image_id, eng_aud_url, hindi_aud_url;
    String name, sans_name;

    ArrayList<String> arrayList = new ArrayList<>();

    TextView timer, title, sansName;
    ImageView detail_image;
    ToggleButton tg_btn_speaker_eng, tg_btn_speaker_hindi;

    MediaPlayer mp;

    int position;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view_exercise);

        Field[] field = R.raw.class.getFields();
        for (int i = 0; i < field.length; i++){
            arrayList.add(field[i].getName());
        }

        title = (TextView) findViewById(R.id.title);
        sansName = (TextView) findViewById(R.id.sans_name);
        detail_image = (ImageView) findViewById(R.id.detail_image);

        tg_btn_speaker_eng = (ToggleButton) findViewById(R.id.tg_btn_speaker_eng);
        tg_btn_speaker_hindi = (ToggleButton) findViewById(R.id.tg_btn_speaker_hindi);

        tg_btn_speaker_eng.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //toggleEnglish(tg_btn_speaker_eng.isChecked());
                int positionEng = 0;
                playSongEng(positionEng);
            }
        });

        tg_btn_speaker_hindi.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //toggleHindi(tg_btn_speaker_hindi.isChecked());
                int positionHindi = 0;
                playSongHindi(positionHindi);
            }
        });

        if (getIntent() != null) {
            image_id = getIntent().getIntExtra("image_id", -1);
            name = getIntent().getStringExtra("name");
            sans_name = getIntent().getStringExtra("sanskrit_name");

            detail_image.setImageResource(image_id);
            title.setText(name);
            sansName.setText(sans_name);
        }
    }


    public void playSongEng(int i) {
        //mp.reset();
        int resId = getResources().getIdentifier(arrayList.get(i), "raw", getPackageName());
        mp = MediaPlayer.create(getApplicationContext(), resId);
        mp.start();
    }

    public void playSongHindi(int i) {
        //mp.reset();
        int resId = getResources().getIdentifier(arrayList.get(i), "raw", getPackageName());
        mp = MediaPlayer.create(getApplicationContext(), resId);
        mp.start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mp != null)
            mp.release();
    }
}

这就是它的样子!

编辑(以避免混淆):刚注意到,该图像名称将是列表练习,而不是查看练习,它对应于ListExercises.java

Edit (to avoid confusion): Just noticed, that image name would have been List Exercises instead of View Exercise which corresponds to ListExercises.java

这对应于ViewExercise.java

谢谢!

推荐答案

您还可以通过在 item_exercise_aud 的父视图上设置点击监听器来在onBindViewHolder内设置点击监听器,而无需使用任何界面这样的布局:

You can also set the click listener inside onBindViewHolder without using any interface by setting the click listener on parent view of your item_exercise_aud layout like this:

holder.parentView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(context, ViewExercise.class);
            intent.putExtra("image_id", exerciseList.get(position).getImage_id());
            intent.putExtra("name", exerciseList.get(position).getName());
            intent.putExtra("sanskrit_name", exerciseList.get(position).getSanskrit_name());
            intent.putExtra("eng_aud_url", exerciseList.get(position).getEng_aud_url());
            intent.putExtra("hindi_aud_url", exerciseList.get(position).getHindi_aud_url());
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    });

或者您可以在此处

编辑- 要根据recyclerview列表的位置播放音频,我们必须将该特定练习的原始文件名发送给媒体播放器.

Edit - To play the audio according to the recyclerview list's position, we have to send the raw file name of that particular exercise to the media player.

ExerciseAudio 模型类添加两个新变量:

Add two new variables to ExerciseAudio model class:

private String file_name_eng;
private String file_name_hindi;

现在如下修改 initData 方法:

private void initData() {

    exerciseList.add(new ExerciseAudio(R.drawable.sample_one, "Sample Exercise One", "Sans One",
            R.raw.sample_one_eng, R.raw.sample_one_hindi,
            "sample_one_eng", "sample_one_hindi"));

    exerciseList.add(new ExerciseAudio(R.drawable.sample_two, "Sample Exercise Two", "Sans Two",
            R.raw.sample_two_eng, R.raw.sample_two_hindi,
            "sample_two_eng", "sample_one_hindi"));

    exerciseList.add(new ExerciseAudio(R.drawable.sample_three, "Sample Exercise Three", "Sans Three",
            R.raw.sample_three_eng, R.raw.sample_three_hindi,
            "sample_three_eng", "sample_three_hindi"));

    exerciseList.add(new ExerciseAudio(R.drawable.sample_four, "Sample Exercise Four", "Sans Four",
            R.raw.sample_four_eng, R.raw.sample_four_hindi,
            "sample_four_eng", "sample_four_hindi"));
}

现在将 ViewExercise 意图修改为:

intent.putExtra("file_name_eng", exerciseList.get(position).getFile_name_eng());
intent.putExtra("file_name_hindi", exerciseList.get(position).getFile_name_hindi());

ViewExercise 活动中获取额外的字符串,并将其发送给mediaplayer:

Get the string extras in ViewExercise activity and send it to the mediaplayer:

file_name_eng = getIntent().getStringExtra("file_name_eng");
file_name_hindi = getIntent().getStringExtra("file_name_hindi");

For english:
    int resId = getResources().getIdentifier(file_name_eng, "raw", getPackageName());

For hindi:
    int resId = getResources().getIdentifier(file_name_hindi, "raw", getPackageName());

这篇关于RecyclerView + MediaPlayer +切换按钮+字符串Uri的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆