2014-11-14 30 views
0

我有一个列表,其中每个元素在播放器上。当我点击“开始”并且一首歌曲开始播放时,seekbar开始移动。当点击“停止”时,歌曲停止播放,并且停止。但是,如果在移动条时我滚动列表并且它离开屏幕,它将开始移动位于屏幕可见区域相同位置的另一条。在自定义适配器中正确显示seekbar

public class RecordAdapter extends BaseAdapter { 
    private MediaPlayer mediaPlayer; 
    private LayoutInflater inflater; 
    private ArrayList<RecordBean> recordBeans; 
    private final Handler handler = new Handler(); 
    private Context ctx; 
    private int global_position; 

     ... 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     final ViewHolder holder; 
     if (convertView == null) { 
      view = inflater.inflate(R.layout.recorditem, parent, false); 
      holder = new ViewHolder(); 
      holder.date = (TextView) view.findViewById(R.id.recordate); 
      holder.seekBar = (SeekBar) view.findViewById(R.id.seekBar); 
      holder.start = (Button) view.findViewById(R.id.btnStart); 
      holder.stop = (Button) view.findViewById(R.id.btnStop); 

      view.setTag(holder); 
     } else { 
      holder = (ViewHolder) view.getTag(); 
     } 
     holder.date.setText(" " + recordBeans.get(position).getDate()); 
     holder.start.setTag(position); 
     holder.stop.setTag(position); 
     holder.seekBar.setTag(position); 
     holder.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 

      @Override 
      public void onProgressChanged(final SeekBar seekBar, final int i, boolean b) { 
       if (b && (Integer)seekBar.getTag()==global_position) { 
        mediaPlayer.seekTo(i); 
       } 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 
      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
      } 
     }); 
     holder.start.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       releaseMP(); 
       try { 
        mediaPlayer = new MediaPlayer(); 
        mediaPlayer.setDataSource(recordBeans.get((Integer) v.getTag()).getFile()); 
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
         @Override 
         public void onPrepared(MediaPlayer mediaPlayer) { 
          mediaPlayer.start(); 
          global_position = position; 
          holder.start.setTextColor(Color.RED); 
          holder.seekBar.setMax(mediaPlayer.getDuration()); 
          startPlayProgressUpdater(holder.seekBar,holder.start); 
         } 
        }); 
        mediaPlayer.prepareAsync(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       if (mediaPlayer == null) { 
        return; 
       } 
       mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
        @Override 
        public void onCompletion(MediaPlayer mediaPlayer) { 
         Log.d("LOG_TAG", "onCompletion"); 
         holder.start.setTextColor(Color.WHITE); 
        } 
       }); 
      } 
     }); 

     holder.stop.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (mediaPlayer == null) 
        return; 
       if ((Integer) v.getTag() == global_position) { 
        mediaPlayer.stop(); 
       } 
      } 
     }); 
     return view; 
    } 

    private void releaseMP() { 
     if (mediaPlayer != null) { 
      try { 
       mediaPlayer.release(); 
       mediaPlayer = null; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    private static class ViewHolder { 
     TextView date; 
     SeekBar seekBar; 
     Button start; 
     Button stop; 
    } 

    public void startPlayProgressUpdater(final SeekBar seek, final Button start) { 
     seek.setProgress(mediaPlayer.getCurrentPosition()); 
     if (mediaPlayer.isPlaying()) { 
      Runnable notification = new Runnable() { 
       public void run() { 
        startPlayProgressUpdater(seek,start); 
       } 
      }; 
      handler.postDelayed(notification, 1000); 
     } else { 
      mediaPlayer.pause(); 
      seek.setProgress(0); 
     } 
    } 
} 

编辑:

我加入geter和seter在recordBean

public int getSeekPos() { 
      return SeekPos; 
     } 

     public void setSeekPos(int seekPos) { 
      SeekPos = seekPos; 
     } 

holder.seekBar.setProgress(recordBeans.get(position).getSeekPos()); 
     holder.date.setText(" " + recordBeans.get(position).getDate()); 

@Override 
      public void onProgressChanged(final SeekBar seekBar, final int i, boolean b) { 
       if (b && (Integer)seekBar.getTag()==global_position) { 
//     mediaPlayer.seekTo(i); 
        recordBeans.get(position).setSeekPos(i); 
       } 
      } 

但我认为它留下一些额外的东西在我的代码

+0

检查:http://stackoverflow.com/questions/26798716/app-crashes-onplaying-audio-in-adapter-of-listview-second-time/26799487#26799487 –

+0

你已经在另一个问题上回答。可以分享代码?这里是你yovopros我回答的地方的链接http://stackoverflow.com/questions/26644851/display-problems-seekbar-in-custom-adapter –

回答

0

,当它离开屏幕的列表项被回收。 你可以尝试在getView调用这个:

holder.seekBar.clearFocus(); 
0

这是一个棘手的过程,但你可以做到这一点通过以下方式,因为我已经看到了,您已经创建RecordBean类的List。所以,你可以做的是你必须在RecordBean创建一个getter二传手,用于存储你的位置SeekBar,如:

public void setSeekPos(int pos) { 
    this.pos = pos; 
} 

public int getSeekPos() { 
    return pos; 
} 

在您的适配器线
holder.date.setText(" " + recordBeans.get(position).getDate());

低于设定搜索条,如进展这样的:holder.seekBar.setProgress(recordBeans.get(position).getSeekPos());

onProgressChanged内添加以下行recordBeans.get(position).setSeekPos(i);

这将解决您的问题。

请让我知道,如果它的工作与否。

感谢

+0

只要删除if语句onProgressChange –

+0

我改变了方法if if @覆盖 public void onProgressChanged(final SeekBar seekBar,final int i,boolean b){if(b &&(Integer)seekBar.getTag()== global_position)mediaPlayer.seekTo(i); } recordBeans.get(position).setSeekPos(i); } –

+0

删除如果(B &&(整数)seekBar.getTag()== global_position){// mediaPlayer.seekTo(ⅰ); recordBeans.get(position).setSeekPos(i); }并且只添加recordBeans.get(position)。setSeekPos(ⅰ); –