Android ListView liste des vidéos
Je suis en train de travailler sur un projet qui devrait inclure une liste de vidéos à partir de allover internet (sources vidéo sont différents, youtube, vimeo, facebook, des vidéos hébergées sur des serveurs, ...). Je suis en train de faire une Liste, où l'élément dispose d'un lecteur vidéo et une description Lorsque l'utilisateur clique sur le bouton de lecture de la vidéo commence à jouer. J'ai fait un exemple, où je l'utiliser VideoView en tant que joueur, mais vite rendu compte que la performance n'est pas très bonne, le défilement est très lag.
Tout cela se trouve dans un RecyclerView et tout est géré par RecyclerViewAdapter.
Je me demande si quelqu'un a une expérience avec cela et quelle est la meilleure pratique.
MODIFIER
Mon code
public class ListFragment extends Fragment {
ArrayList<Video> videoList;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
RecyclerView rv = (RecyclerView) inflater.inflate(
R.layout.fragment_cheese_list, container, false);
videoList = SplashActivity.videoList;
setupRecyclerView(rv);
return rv;
}
private void setupRecyclerView(RecyclerView recyclerView) {
recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
recyclerView.setAdapter(new SimpleStringRecyclerViewAdapter(getActivity(), videoList));
}
public class SimpleStringRecyclerViewAdapter
extends RecyclerView.Adapter<SimpleStringRecyclerViewAdapter.ViewHolder> {
private final TypedValue mTypedValue = new TypedValue();
private int mBackground;
private ArrayList<Video> mVideoList;
public class ViewHolder extends RecyclerView.ViewHolder {
public String mBoundString;
public final View mView;
public final VideoView mVideoView;
public final TextView mTextView;
public final TextView mCountTextView;
public final TextView mHintTextView;
public final Button mPlayButton;
public final ImageView mFavoriteIcon;
public final RelativeLayout mRelativeLayout;
public final ProgressBar mProgressBar;
public ViewHolder(View view) {
super(view);
mView = view;
mVideoView = (VideoView) view.findViewById(R.id.listVideoView);
mTextView = (TextView) view.findViewById(R.id.gifTitleTextView);
mCountTextView = (TextView) view.findViewById(R.id.countTextView);
mHintTextView = (TextView) view.findViewById(R.id.hintTextView);
mPlayButton = (Button) view.findViewById(R.id.playButton);
mFavoriteIcon = (ImageView) view.findViewById(R.id.favoriteImageView);
mRelativeLayout = (RelativeLayout) view.findViewById(R.id.relativeLayout);
mProgressBar = (ProgressBar) view.findViewById(R.id.progressBar);
}
@Override
public String toString() {
return super.toString() + " '" + mTextView.getText();
}
}
public SimpleStringRecyclerViewAdapter(Context context, ArrayList<Video> videoList) {
context.getTheme().resolveAttribute(R.attr.selectableItemBackground, mTypedValue, true);
mVideoList = videoList;
mBackground = mTypedValue.resourceId;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
view.setBackgroundResource(mBackground);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
final Video tempVideo = mVideoList.get(position);
holder.mBoundString = tempVideo.getGifTitle();
holder.mTextView.setText(tempVideo.getGifTitle());
float count = tempVideo.getCount();
String countText = "";
if (count >= 1000)
countText = String.format("%.1f", count / 1000) + "k";
else
countText = String.format("%d", (int)count);
holder.mCountTextView.setText(countText);
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.mVideoView.start();
}
});
holder.mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//This is just to show image when loaded
mp.start();
mp.pause();
}
});
holder.mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//setLooping(true) didn't work, thats why this workaround
holder.mVideoView.setVideoPath(tempVideo.getGifUrl());
holder.mVideoView.start();
}
});
holder.mVideoView.setVideoPath(tempVideo.getGifUrl());
}
@Override
public int getItemCount() {
return videoList.size();
}
}
}
Application ressemble à ceci:
ici, mis à jour le post
Est-ce que votre application s'exécute rapidement et passe lentement quand vous faites défiler vers le bas de plus en plus?
Non, la performance est toujours le même (lag). Il y a un moyen, parce que cette application est comme 9gag app, qui joue gifs et fonctionne très bien.
Ne les vidéos démarrent automatiquement? Ou besoin d'être cliqué?
OriginalL'auteur ZassX | 2015-12-01
Vous devez vous connecter pour publier un commentaire.
Je pense que VideoView appelle prapare méthode automatiquement à chaque nouvelle ligne est tracée. Donc, chaque fois que vous faites défiler, la vidéo démarre et s'arrête. Truc que vous avez fait pour afficher la vignette n'est pas pratique. Il peut très influent sur la performance. Essayez d'éviter et de vérifier comment l'évolution de la performance. Aussi, vous pouvez contrôler l'utilisation de votre CPU de bas de disposition de Android Studio.
Également les lignes suivantes sont nécessaires pour appelé une seule fois. Sinon, comme vous l'avez écrit dans onBindView chaque fois que vous faites défiler de nouveaux auditeurs sont créés et il en coûte à la mémoire.
Nous avons besoin pour vérifier si le problème est vrai ou pas. Vous pouvez essayer d'ajouter un journal à onPrepare corps de la méthode et de vérifier les résultats.
Je suis en attente de réponse.
Bonne chance là-bas.
Heureux, il a aidé. Vous avez besoin de travailler sur elle pour la rendre plus lisse plus 🙁
OriginalL'auteur Emre Aktürk