最近在写一个和视频有关的项目,遇到了这个问题,开始使用ListView中嵌入MediaPlayer和TextureView老是出问题,播放的时候item会出现错乱的现象,原因在于使用ViewHolder复用View导致的,如果每次都重新加载View就不会出问题了,这个demo中没有使用ListView,使用了android.support.v7.widget.RecyclerView,达到了预期的目的,希望对正在迷茫中的你有所帮助。
在一个列表视频交流群( 290087364)中找到了一个Demo,然后在此基础上进行了修改,感谢群主的无私贡献,我也不能太自私了,就贴出来,希望能抛砖引玉,给大家带来一点的帮助。
首先看一下,重写的一个TextureView,代码中没有注释,代码量比较少,很容易理解,TextureVideoView主要用于控制视频的播放。
package com.example.textureviewdemo;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnInfoListener;
import android.util.AttributeSet;
import android.view.Surface;
import android.view.TextureView;
import android.view.TextureView.SurfaceTextureListener;
@SuppressLint("NewApi")
public class TextureVideoView extends TextureView implements SurfaceTextureListener {
private MediaPlayer mediaPlayer;
private Context context;
MediaState mediaState;
public MediaPlayer getMediaPlayer() {
return mediaPlayer;
}
public interface OnStateChangeListener{
public void onSurfaceTextureDestroyed(SurfaceTexture surface);
public void onBuffering();
public void onPlaying();
public void onSeek(int max,int progress);
public void onStop();
}
OnStateChangeListener onStateChangeListener;
public void setOnStateChangeListener(OnStateChangeListener onStateChangeListener) {
this.onStateChangeListener = onStateChangeListener;
}
//监听视频的缓冲状态
private OnInfoListener onInfoListener=new OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
if(onStateChangeListener!=null)
{
onStateChangeListener.onPlaying();
if(what==MediaPlayer.MEDIA_INFO_BUFFERING_START)
{
onStateChangeListener.onBuffering();
}else if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END) {
onStateChangeListener.onPlaying();
}
}
retu