gpt4 book ai didi

Android ListView 视频列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:19 24 4
gpt4 key购买 nike

我正在做一个项目,该项目应该包括来自整个互联网的视频列表(视频来源不同——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();
}
}

应用看起来像这样:

enter image description here

最佳答案

我认为每当绘制新行时,VideoView 都会自动调用 prapare 方法。因此,每次滚动时,视频都会开始和暂停。您为显示缩略图所做的技巧并不实用。它可能会极大地影响性能。尽量避免并检查性能如何变化。您还可以从 Android Studio 的底部布局控制 CPU 使用率。

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();
}
});

下面几行也需要调用一次。否则,当您每次滚动时在 onBindView 中编写它们时,都会创建新的监听器并且会占用内存。

我们需要验证问题是否属实。您可以尝试在onPrepare 方法体中添加日志并查看结果。

我正在等待回复。

祝你好运。

关于Android ListView 视频列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34022759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com