ListVideo视频播放列表

<ListView
    android:layout_width="match_parent"
    android:id="@+id/lv"
    android:layout_height="match_parent"></ListView>

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <SurfaceView
        android:id="@+id/surface_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"/>

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"/>
</FrameLayout>

<TextView
    android:id="@+id/content"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>    
public class MyAdapter extends BaseAdapter {
    private List<VideoItem> list;
    private Context context;
    private LayoutInflater inflater;
    private MediaPlayer player;
    //当前播放item的position,-1表示没有任何item在播放
    private int currentPlayPosition = -1;
    private int prePosition = -1;

    public MyAdapter(Context context, List<VideoItem> list) {
        this.context = context;
        this.list = list;
        inflater = LayoutInflater.from(context);
        player = new MediaPlayer();
        player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            //异步准备完成时调用start方法开始播放
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ListView listView = (ListView) parent;
        int firstVisiblePosition = listView.getFirstVisiblePosition();
        if (prePosition != firstVisiblePosition) {
            if (prePosition == currentPlayPosition) {
                player.stop();
                currentPlayPosition = -1;
            }
            prePosition = firstVisiblePosition;
        }
        Log.d("google_lenve_fb", "getView: position:" + position);
        ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.listview_item, null);
            holder = new ViewHolder();
            holder.content = (TextView) convertView.findViewById(R.id.content);
            holder.cover = (ImageView) convertView.findViewById(R.id.iv);
            holder.surfaceView = (SurfaceView) convertView.findViewById(R.id.surface_view);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        VideoItem videoItem = list.get(position);
        holder.content.setText(videoItem.getContent());
        //加载缩略图
        Picasso.with(context).load(videoItem.getCover()).placeholder(R.mipmap.ic_launcher).into(holder.cover);
        //重新设置图片和SurfaceView的宽和高
        ViewGroup.LayoutParams lp = holder.surfaceView.getLayoutParams();
        lp.width = videoItem.getWidth();
        lp.height = videoItem.getHeight();
        holder.surfaceView.setLayoutParams(lp);
        holder.cover.setLayoutParams(lp);
        /*************处理播放****************/
//        //获取每张图片所存在
//        Object tag = holder.cover.getTag();
//        //当tag不为空时,说明该item是被回收的item,而不是第一屏的item
//        if (tag != null) {
//            Integer tag1 = (Integer) tag;
//            //当item被移出屏幕时,停止播放
//            if (tag1 == currentPlayPosition && tag1 != position) {
//                player.stop();
//                currentPlayPosition = -1;
//            }
//        }

        //将当前item的position保存为图片的tag
        holder.cover.setTag(position);
        String p360 = videoItem.getP360();

        //判断当前播放的item是不是即将要显示的item
        if (currentPlayPosition == position) {
            holder.cover.setVisibility(View.INVISIBLE);
            holder.surfaceView.setVisibility(View.VISIBLE);
            //重置MediaPlayer
            player.reset();
            //设置显示视频需要的SurfaceHolder
            player.setDisplay(holder.surfaceView.getHolder());
            try {
                //设置数据源
                player.setDataSource(context, Uri.parse(p360));
                //异步准备
                player.prepareAsync();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            holder.surfaceView.setVisibility(View.INVISIBLE);
            holder.cover.setVisibility(View.VISIBLE);
        }

        holder.cover.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setVisibility(View.INVISIBLE);
                //获得当前ImageView中携带的tag,由该tag可以获得要播放第几个item
                Integer tag = (Integer) v.getTag();
                //当点击ImageView时,如果已经有item在播放,则先停止播放
                if (player != null && player.isPlaying()) {
                    player.stop();
                }
                currentPlayPosition = tag;
                //刷新列表,重新刷新列表会调用getView方法
                notifyDataSetChanged();
            }
        });

        return convertView;
    }

    public void stop() {
        //停止播放并释放资源
        if (player != null) {
            player.stop();
            player.release();
        }
    }

    class ViewHolder {
        SurfaceView surfaceView;
        ImageView cover;
        TextView content;
    }
}
public class MainActivity extends AppCompatActivity {

    private List<VideoItem> list;
    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView listView = (ListView) findViewById(R.id.lv);
        initData();
        adapter = new MyAdapter(this, list);
        listView.setAdapter(adapter);
    }

    private void initData() {
        String jsonStr = getJsonString();
        parseJson(jsonStr);
    }

    private void parseJson(String jsonStr) {
        list = new ArrayList<>();
        try {
            JSONObject jo = new JSONObject(jsonStr);
            JSONObject data = jo.getJSONObject("data");
            JSONArray dataArr = data.getJSONArray("data");
            for (int i = 0; i < dataArr.length(); i++) {
                JSONObject item = dataArr.getJSONObject(i);
                String p360_video = null;
                int video_height = 0;
                int video_width = 0;
                String cover = null;
                String content = null;
                try {
                    JSONObject group = item.getJSONObject("group");
                    p360_video = group.getJSONObject("360p_video").getJSONArray("url_list").getJSONObject(0).getString("url");
                    video_height = group.getInt("video_height");
                    video_width = group.getInt("video_width");
                    cover = group.getJSONObject("medium_cover").getJSONArray("url_list").getJSONObject(0).getString("url");
                    content = group.getString("content");
                    VideoItem videoItem = new VideoItem(content, cover, video_height, p360_video, video_width);
                    list.add(videoItem);
                } catch (JSONException e) {
//                    e.printStackTrace();
                    //在这里处理异常数据...

                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    private String getJsonString() {
        InputStream is = null;
        StringBuffer result = new StringBuffer();
        try {
            is = getAssets().open("video1.json");
            int len = 0;
            byte[] buf = new byte[1024];
            while ((len = is.read(buf)) != -1) {
                result.append(new String(buf, 0, len));
            }
            return result.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    @Override
    protected void onStop() {
        super.onStop();
        adapter.stop();
    }
}
时间: 2024-10-10 21:00:14

ListVideo视频播放列表的相关文章

制作爱奇艺视频播放列表

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>爱奇艺播放列表</title> <style type="text/css"> li h2{ font-size:16px; color:#4D4D4D; } li p:first-of-type{ color:#640000; font-size:14px; } l

[Android] Android 实现类似 今日头条 视频播放列表

演示实例如下: Talk is cheap. Show me the code 话不多说,代码在这里下载! https://github.com/wukong1688/Android_BaseVideo 如果觉得有帮助,欢迎在 Github 为我 star! 本博客地址: wukong1688 本文原文地址:https://www.cnblogs.com/wukong1688/p/10739635.html 转载请著名出处!谢谢~~ 原文地址:https://www.cnblogs.com/wu

为Web程序员准备的10个最棒的jQuery视频插件

众多的插件使得 jQuery 成为一个非常流行的框架.现在网站中视频和音频的使用比之前要频繁的多了.而使用jQuery插件可以让这个步骤变得简单很多.因此这里收集了10个非常棒的jQuery视频插件供你选择. 1. Bigvideo.js 这个插件可以很方便的为你的网站添加视频背景.它可以无声的播放背景视频(或一系列视频).你也可以用它制作视频播放列表. BigVideo.js还可以显示大背景图片,这对于不支持自动播放视频的设备来说是非常适合的. 2. jPlayer jPlayer 是一个用J

使用Vitamio打造自己的Android万能播放器(6)——在线播放(播放列表)

前言 新版本的VPlayer由设计转入开发阶段,预计开发周期为一个月,这也意味着新版本的Vitamio将随之发布,开发者们可以和本系列文章一样,先开发其他功能.本章内容为"在线视频播放列表",集合了主流各大视频网站的手机版,欢迎给"开播视频"反馈改进建议! 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 系列 1.使用Vitamio打造自己的Androi

视频框架Vitamio学习

概述 开发公司一个直播项目时,本来有个播放视频广告的功能,到最后不了了之.虽然没有在项目中做要求,但是这个点子还是激起了我研究多媒体的好奇心.刚好后面遇到一款比较喜欢的视频APP魔力盒,上面视频播放的体验及整个产品的设计都是我喜欢的类型,于是反编译了一下,发现其中用到了一个视频框架Vitamio,(还有一个很流畅的下拉刷新框架hardmark), 然后,一番百度google,发现居然是国内团队开发的框架,而且应用已经很广泛.所以研究了下,自己写了个demo.  资料总结 Vitamio官网:ht

基于 IJKPlayer-concat 协议的视频无缝拼接技术实现

一.前言 Hi,大家好,我是承香墨影! 开门见山,开篇名义.今天来聊聊如何将多段视频,拼接成一个完整而连续的视频,然后无缝进行播放. 这样的需求应该不算偏门吧? 最简单的就是一些视频 App,会将大段的视频切割成小段的视频进行播放,还有一些在播放视频之前,会插播一段广告,这些需求都可以被本文的内容覆盖到. 说到多个视频拼接来说,如果你了解过 Google 出的 ExoPlayer 的话,它其内正好有一个 ConcatenatingMediaSource 可以来完成多个视频源的拼接工作,并且 Ap

Android 9 的非 SDK 接口限制 | 中文教学视频

我们一直致力于为 Android 用户和开发者提供稳定的体验.秉持这种理念,雅思词汇书我们逐步限制应用使用非公开接口,因为这种做法往往导致用户遭遇系统崩溃及开发者需要紧急发布修复的风险.在 Android 8.0 中,我们限制了 C/C++ 代码所能使用的符号,从而确保使用 C/C++ 代码的应用能够始终对接稳定的 NDK 接口,而不会因为使用不稳定的非 NDK 接口而频频奔溃.从 Android 9 开始,为了更进一步提升系统的稳定性,我们将此类限制扩展至 Java 语言 SDK 接口. 在这

Android 应用兼容性最佳实践 | 中文教学视频

本期中文视频向各位开发者介绍如何现代化您的应用,其中包括 Android?O.Android P?(预览版)?的新特性.行为变更.应用开发中常见的兼容性最佳实践,以及测试.兼容系统时需要注意的一些事项.希望大家尽快将开发的应用兼容新的 Android 系统. ?我们一起来看下视频 讲解? 视频中提到的文档链接: >> targetSdkVersion 要求:https://goo.gl/XM9B5Z >> targetSdkVersion 升级指南:https://goo.gl/Y

Vitamio 视频播放

 资料总结 Vitamio官网:https://www.vitamio.org 源码地址:https://github.com/yixia/VitamioBundle 最佳教程:大名鼎鼎的农民伯伯博客http://www.cnblogs.com/over140/category/409230.html,农民伯伯应该是这个开发团队的一员. VPlayer好像是这个框架的最佳产品,不过看到官网的一些合作伙伴,如果确实是用到这个框架的话,好像也很不错(可以反编译看看,学习学习~) 下面是农名伯伯开发教