【发布时间】:2015-12-01 14:26:26
【问题描述】:
我正在开展一个项目,该项目应包括来自整个互联网的视频列表(视频来源不同 - youtube、vimeo、facebook、托管在服务器上的视频......)。我正在尝试制作一个 ListView,其中项目有一个视频播放器和一些描述当用户单击播放按钮时,视频开始播放。我做了一个例子,我使用 VideoView 作为播放器,但很快意识到性能不是很好 - 滚动非常滞后。
所有这些都位于 RecyclerView 中,一切都由 RecyclerViewAdapter 处理。
我想知道是否有人对此有任何经验,最佳做法是什么。
编辑
我的代码
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();
}
}
}
应用看起来像这样:
【问题讨论】:
-
你能贴出代码吗?应该是结构问题。也许您正在重新创建或重新初始化您的视频播放器对象?
-
@EmreAktürk 在这里,更新帖子
-
您的应用程序是否运行得越快越慢?
-
不,性能总是一样的(滞后)。必须有办法,因为这个应用就像 9gag 应用,播放 gif 并且效果很好。
-
视频会自动开始吗?还是需要点击?
标签: android listview media-player android-recyclerview android-videoview