【问题标题】:Audio Playing from URI Inside Listview , But Seekbar is not Updating in Android Listview item从 Listview 内的 URI 播放音频,但 Seekbar 未在 Android Listview 项目中更新
【发布时间】:2016-07-21 12:30:40
【问题描述】:
  1. 我正在播放来自 Uri 的音频,它工作正常。
  2. 从每个 Listview 项目中单击一个按钮。

问题:列表视图中正在播放音频,但 Seekbar 仍然没有移动(正在更新)。

编辑:1

1.音频在每个 Listview 项目中播放完美但 Seekbar 不工作(不更新)

请帮我解决这个问题。

我的 Listview 数组适配器 类:

适配器类

     private static final int UPDATE_FREQUENCY = 500;

 int progress=0;

        public View getView(final int position, View view, ViewGroup parent) {
            LayoutInflater inflater = context.getLayoutInflater();
            View rowView = inflater.inflate(R.layout.audio_listview, null, true);


            ListenAUdioButton = (Button) rowView.findViewById(R.id.ListenAudiobuttonxml);
            seek_bar_view = (SeekBar) rowView.findViewById(R.id.seek_bar);
            ListenAUdioButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    // text_shown.setText("Playing...");
                    try {


                        try {
                            // get Internet status
                            isInternetPresent = cd1.isConnectingToInternet();
                            // check for Internet status
                            if (isInternetPresent) {
                                if (!itemname3_AUDIO_FILE[position].equals("") || !itemname3_AUDIO_FILE[position].equals("null")) {
                                    System.out.println(" AUDIO FILE :-)" + itemname3_AUDIO_FILE[position]);

                                    player = new MediaPlayer();
                                    player.setAudioStreamType(AudioManager.STREAM_MUSIC);

                                    player.setDataSource(context, Uri.parse(itemname3_AUDIO_FILE[position]));
                                    player.prepareAsync();


                                    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                                        @Override
                                        public void onPrepared(MediaPlayer mp) {
                                            try {

                                                mp.start();

                                                seek_bar_view.setMax(player.getDuration());
                                                updatePosition();


                                            } catch (Exception e) {
                                                e.printStackTrace();
                                            }
                                        }
                                    });


                                    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                                        @Override
                                        public void onCompletion(MediaPlayer mp) {
                                            stopPlay();
                                        }
                                    });


                                    MediaPlayer.OnErrorListener onError = new MediaPlayer.OnErrorListener() {

                                        @Override
                                        public boolean onError(MediaPlayer mp, int what, int extra) {
                                            // returning false will call the OnCompletionListener
                                            return false;
                                        }
                                    };


                                } else {
                                    Toast.makeText(getContext(), "Audio Not Found..!", Toast.LENGTH_SHORT).show();
                                }

                            } else {

                                Toast.makeText(getContext(), "Please Check Your Internet Connection..!", Toast.LENGTH_SHORT).show();

                            }

                        } catch (Exception e) {
                            e.printStackTrace();

                            Toast.makeText(getContext(), "Audio Not Found..!", Toast.LENGTH_SHORT).show();

                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            return rowView;
        }

        private void stopPlay() {
            player.stop();
            player.reset();
            // playButton.setImageResource(android.R.drawable.ic_media_play);
            handler.removeCallbacks(updatePositionRunnable);
            seek_bar_view.setProgress(0);

            // isStarted = false;
        }


        private final Handler handler = new Handler();

        private final Runnable updatePositionRunnable = new Runnable() {
            public void run() {
                updatePosition();
            }
        };



private void updatePosition()
    {
        handler.removeCallbacks(updatePositionRunnable);

        seek_bar_view.setProgress(progress);
progress=getProgressPercentage(player.getCurrentPosition(),player.getDuration();
        notifyDataSetChanged();

       handler.postDelayed(updatePositionRunnable, UPDATE_FREQUENCY);

    }

【问题讨论】:

    标签: android listview audio android-mediaplayer


    【解决方案1】:

    你需要每秒更新你的搜索栏位置(值)..

    设置搜索栏最大值..

    seek_bar_view.setMax((int) player.getDuration());
    

    并每秒更新一次以显示进度

    Handler mHandler = new Handler();
        runOnUiThread(new Runnable() {
                          @Override
                          public void run() {
                              seek_bar_view.setProgress((int) player.getCurrentPosition());
                          }
                          mHandler.postDelayed(this,1000);
                      }
        );
    

    【讨论】:

    • 在我的代码中我必须做这个 Change.when Onclicked listview item
    • 播放音频时
    【解决方案2】:

    看这个:

     seek_bar_view.setProgress(player.getCurrentPosition()); 
    

    此处 player.getCurrentPosition() 以毫秒为单位返回时间,您需要将其转换为 int 然后将进度设置为 seekBar。

    试试这个:

     public static int getProgressPercentage(long currentDuration, long totalDuration){
        Double percentage = (double) 0;
    
        long currentSeconds = (int) (currentDuration / 1000);
        long totalSeconds = (int) (totalDuration / 1000);
    
        // calculating percentage
        percentage =(((double)currentSeconds)/totalSeconds)*100;
    
        // return percentage
        return percentage.intValue();
    }
    

    现在获取 SeekBar 的百分比,如下所示:

    int currentProgress=getProgressPercentage(player.getCurrentPosition(), player.getDuration());
    
    seek_bar_view.setProgress(currentProgress); 
    

    已编辑:

    对于您的具体情况,在 ListView 项目内:

    每次更改搜索栏的位置时都需要通知适配器。 为此,最简单的方法是在您用来设置适配器的 POJO 类中获取一个变量。

    在你的 POJO 类中

       int progress=0;
    

    在您的适配器中,设置搜索栏进度

       seekbar.setProgress(progress);
    

    在您的适配器中,更改进度和通知适配器的值

     progress=getProgressPercentage(player.getCurrentPosition(), player.getDuration());
     notifyDataSetChanged()
    

    //重新编辑:

    seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {        
    
    @Override        
    public void onStopTrackingTouch(SeekBar seekBar) {      
        // TODO Auto-generated method stub       
    }        
    
    @Override        
    public void onStartTrackingTouch(SeekBar seekBar) {     
        // TODO Auto-generated method stub       
    }        
    
    @Override        
    public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {     
        // TODO Auto-generated method stub       
    
      notifyDataSetChanged();
    
    }        
    });        
    

    【讨论】:

    • 抱歉,我现在不能测试你的代码。请参阅本教程,androidhive.info/2012/03/android-building-audio-player-tutorial。它肯定会有所帮助。
    • 仍然无法在 Listview 音频电镀 Perfect 中工作,但 Seekbar 仍然保持不变。
    • 我的意思是当前代码,即您尝试使用 POJO 类解决方案的代码。
    • 检查我的 updatePosition 方法,我没有任何 Pojo 类
    • @Kumar,问题出在适配器上,您需要通知它正在观察的数据已更改。您没有使用 POJO 类,因此请尝试添加搜索栏更改列表器并在其中调用 notifyDataSetChanged()
    猜你喜欢
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    相关资源
    最近更新 更多