La lecture de la vidéo à l'aide de textureview dans recyclerview

Je suis en train de mettre en œuvre une liste avec des vidéos comme vine ou Instagram app. Où ils jouent de lecture de la vidéo lors de l'élément de la liste est affichée ou entièrement visible et la vidéo se met en pause lorsque l'élément de liste obtient cacher. Je suis à l'aide de textureview avec media player pour lire une vidéo à partir de l'url et de l'ajouter comme élément de liste dans recyclerview. Voici mon code.

VideosAdapter Classe:

public class VideosAdapter extends RecyclerView.Adapter<VideosAdapter.ViewHolder> {
Context context;
private ArrayList<String> urls;
public static class ViewHolder extends RecyclerView.ViewHolder {
public LinearLayout layout;
public TextView textView;
public ViewHolder(View v) {
super(v);
layout = (LinearLayout) v.findViewById(R.id.linearLayout);
textView = (TextView) v.findViewById(R.id.textView);
}
}
public VideosAdapter(Context context, ArrayList<String> urls) {
this.context = context;
this.urls = urls;
}
//Create new views (invoked by the layout manager)
@Override
public VideosAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//create a new view
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_main, parent, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
//Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String url = urls.get(position);
holder.textView.setText(url);
playVideo(holder, url);
}
@Override
public int getItemCount() {
return urls.size();
}
private void playVideo(ViewHolder holder, String url)
{
final CustomVideoPlayer vid = new CustomVideoPlayer(String.valueOf(url), context);
holder.layout.addView(vid);
holder.layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
vid.changePlayState();
}
});
}
}

CustomVideoPlayer Classe:

public class CustomVideoPlayer extends  TextureView implements TextureView.SurfaceTextureListener
{
Context context;
String url;
MediaPlayer mp;
Surface surface;
SurfaceTexture s;
public CustomVideoPlayer(Context context, AttributeSet attrs)
{
super(context, attrs);
this.context = context;
}
public CustomVideoPlayer(String ur, Context context)
{
super(context);
this.setSurfaceTextureListener(this);
this.url = ur;
this.context = context;
}
@Override
public void onSurfaceTextureAvailable(final SurfaceTexture surface, int arg1, int arg2) {
this.s = surface;
Log.d("url", this.url);
startVideo(surface);
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture arg0) {
return true;
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1,int arg2) {
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture arg0) {
}
public void setVideo(String url)
{
this.url = url;
}
public void startVideo(SurfaceTexture t)
{
this.surface = new Surface(t);
this.mp = new MediaPlayer();
this.mp.setSurface(this.surface);
try {
Uri uri = Uri.parse(this.url);
this.mp.setDataSource(url);
this.mp.prepareAsync();
this.mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
mp.setLooping(true);
mp.start();
}
});
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (SecurityException e1) {
e1.printStackTrace();
} catch (IllegalStateException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
try {
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
public void changePlayState()
{
if(this.mp.isPlaying())
this.mp.pause();
else
this.mp.start();
}
}

Lorsque j'exécute ce code il y a plusieurs questions dans ce.

1) les deux Premiers articles/vidéos des tampons et de la jouer fine. Mais quand je scroll, il ne prend pas en charge le tiers de la vidéo et la première vidéo est supprimée de la liste.

2) Sur faire défiler les vidéos/les éléments de la liste commence de mise en mémoire tampon de nouveau pour l'élément qui a été déjà mis en mémoire tampon.

3) Sur le défilement rapide de la liste est trop de lag et de se coincer et se bloque.

Ci-joint l'image de logcat que je reçois alors que la liste de défilement et de la vidéo à jouer.

La lecture de la vidéo à l'aide de textureview dans recyclerview

Quelqu'un peut me guider à travers cette? Quelle est la bonne façon de créer une liste comme la vigne app?

  • Il est dépendant du périphérique de limite sur le nombre de simultanée de vidéos. Assurez-vous que vous êtes à l'arrêt de la lecture de la vidéo précédente avant de commencer la lecture sur un nouveau. Le 'M' de la sortie est prévue pour ajouter une API qui va vous dire ce que la limite est -- developer.android.com/preview/api-overview.html#video .
  • Merci pour la réponse. J'ai ajouté 3 url à jouer. Mais n'a pas commencé la lecture et commenté cette ligne de mp.start(); à partir de startVideo(surface) de la méthode. Je reçois la question de la listview est coincé pendant 5-6 secondes quand je scroll. Pourquoi je suis Si cette question est liée à la lecture ou la lecture de plusieurs vidéos à la fois, comme maintenant, je suis justement en train de préparer toutes les vidéos mais je n'ai pas commencé la lecture encore.