Android ListView视频列表

Android ListView视频列表,android,listview,media-player,android-recyclerview,android-videoview,Android,Listview,Media Player,Android Recyclerview,Android Videoview,我正在做一个项目,其中应该包括一个来自互联网的视频列表(视频来源不同——youtube、vimeo、facebook、服务器上托管的视频等等)。我试图制作一个ListView,当用户点击播放按钮开始播放视频时,该项目有一个视频播放器和一些描述。我举了一个例子,我使用VideoView作为播放器,但很快意识到性能不是很好——滚动非常缓慢 所有这些都位于一个RecycleView中,一切都由RecycleWebAdapter处理 我想知道是否有人有这方面的经验,最好的做法是什么 编辑 我的代码 pu

我正在做一个项目,其中应该包括一个来自互联网的视频列表(视频来源不同——youtube、vimeo、facebook、服务器上托管的视频等等)。我试图制作一个ListView,当用户点击播放按钮开始播放视频时,该项目有一个视频播放器和一些描述。我举了一个例子,我使用VideoView作为播放器,但很快意识到性能不是很好——滚动非常缓慢

所有这些都位于一个RecycleView中,一切都由RecycleWebAdapter处理

我想知道是否有人有这方面的经验,最好的做法是什么

编辑

我的代码

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();
    }
}
公共类ListFragment扩展了片段{
ArrayList视频列表;
@可空
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
RecyclerView rv=(RecyclerView)充气机。充气(
R.layout.fragment_cheese_list,容器,假);
videoList=SplashActivity.videoList;
设置回收视图(rv);
返回rv;
}
私有void设置回收视图(回收视图回收视图){
setLayoutManager(新的LinearLayoutManager(recyclerView.getContext());
setAdapter(新的SimpleStringRecycleServiceAdapter(getActivity(),videoList));
}
公共类SimpleStringRecycleServiceAdapter
扩展RecyclerView.Adapter{
私有最终类型值mTypedValue=新类型值();
私人国际mBackground;
私有数组列表;
公共类ViewHolder扩展了RecyclerView.ViewHolder{
公共字符串;
公共最终视图mView;
公共最终视频视图;
公共最终文本视图mTextView;
公共最终文本视图mCountTextView;
公共最终文本视图mHintTextView;
公共最终按钮mPlayButton;
公共最终图像视图MFAVORITECON;
公共最终相对物布置图;
公共最终进度栏;
公共视图持有者(视图){
超级(视图);
mView=视图;
mVideoView=(VideoView)view.findviewbyd(R.id.listVideoView);
mTextView=(TextView)view.findViewById(R.id.giftItemExtView);
mCountTextView=(TextView)view.findViewById(R.id.countTextView);
mHintTextView=(TextView)view.findViewById(R.id.hintTextView);
mPlayButton=(Button)view.findviewbyd(R.id.playButton);
mfavoritecon=(ImageView)view.findViewById(R.id.FavoriteMageView);
mrrelativelayout=(RelativeLayout)view.findViewById(R.id.RelativeLayout);
mProgressBar=(ProgressBar)view.findViewById(R.id.ProgressBar);
}
@凌驾
公共字符串toString(){
返回super.toString()+“'”+mTextView.getText();
}
}
公共SimpleStringRecycleServiceAdapter(上下文,ArrayList视频列表){
context.getTheme().resolveAttribute(R.attr.selectableItemBackground,mTypedValue,true);
mvideolost=视频列表;
mBackground=mTypedValue.resourceId;
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.list_项,父项,假);
视图.setBackgroundResource(mBackground);
返回新的ViewHolder(视图);
}
@凌驾
公共无效onBindViewHolder(最终视图持有人,最终整型位置){
最终视频tempVideo=mvideolost.get(位置);
holder.mBoundString=tempVideo.getGiftTitle();
holder.mTextView.setText(tempVideo.getGiftTitle());
float count=tempVideo.getCount();
字符串countText=“”;
如果(计数>=1000)
countText=String.format(“%.1f”,count/1000)+“k”;
其他的
countText=String.format(“%d”,(int)count);
holder.mCountTextView.setText(countText);
holder.mView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
holder.mVideoView.start();
}
});
holder.mVideoView.setOnPreparedListener(新的MediaPlayer.OnPreparedListener(){
@凌驾
已准备好公开作废(MediaPlayer mp){
//这只是为了在加载时显示图像
mp.start();
mp.pause();
}
});
holder.mVideoView.setOnCompletionListener(新的MediaPlayer.OnCompletionListener(){
@凌驾
完成时的公共作废(MediaPlayer mp){
//setLooping(true)不起作用,这就是此解决方案的原因
holder.mVideoView.setVideoPath(tempVideo.getGifUrl());
holder.mVideoView.start();
}
});
holder.mVideoView.setVideoPath(tempVideo.getGifUrl());
}
@凌驾
public int getItemCount(){
返回videoList.size();
}
}
}

应用程序如下所示:


我认为每当绘制新行时,VideoView都会自动调用prapare方法。所以每次滚动时,视频都会启动和暂停。你们所做的显示缩略图的技巧是不实用的。它可能会极大地影响性能。尽量避免并检查性能如何变化。您还可以从AndroidStudio的底部布局控制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方法体并检查结果

我在等待答复


祝你好运。

你能发代码吗?应该有结构问题。也许你正在重新创建或重新初始化你的视频播放器对象?@EmreAktürk这里,更新p