ListView 中显示的 YouTube 播放列表

2023-12-10

我有一个GDATA我想在我的应用程序中使用的链接。此链接包含一个播放列表,我希望该播放列表显示在ListView。然后,用户将选择他/她想要的视频,然后就可以使用本地 Youtube 应用程序在应用程序中播放该视频。

请给我指出一个直观的教程。我知道 YouTube API 页面包含所有信息,但我可以了解其中的要点。


我希望这会给您一个想法,尝试一下(只是一个示例),如果您有更好的解决方案,也请告诉我。

 package com.test.utubevdo;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.ArrayList;

    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.json.JSONArray;
    import org.json.JSONObject;

    import android.app.Activity;
    import android.app.Dialog;
    import android.app.ListActivity;
    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.ContextMenu;
    import android.view.ContextMenu.ContextMenuInfo;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.WindowManager;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.Button;
    import android.widget.Gallery;
    import android.widget.ListView;
    import android.widget.VideoView;


    public class AndroidThumbnailList extends Activity{
        ArrayList <YTBVideo> videos = new ArrayList<YTBVideo>();

    ProgressDialog progressDialog = null;
    VideoView vdovw_1 = null;
    String vdoURL = "";
    ListView listview = null;
    Gallery gallery = null;
    Dialog noDataAlert = null;


    Handler imageLoaderHandler = new Handler() {
        public void handleMessage(final Message msg) {
            progressDialog.dismiss();
            if(msg.what == 1){

                showErrorMessage("Communication Error", "Error Occured while retrieving the data from Youtube.\n Please try again");

            }else{
            System.out.println("videos  ::"+videos.size());
            //listview.setAdapter(new VideoViewAdapter(AndroidThumbnailList.this, videos));
            gallery.setAdapter(new VideoViewAdapter1(AndroidThumbnailList.this, videos));
            }

        }
    };



    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


         getWindow().setFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        //setContentView(R.layout.imagelist_layout);
        //listview = (ListView)findViewById(R.id.listView1);
         setContentView(R.layout.gallery_imagelist_layout);
         gallery  = (Gallery) findViewById(R.id.galleryView);

         gallery.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView parent, View view, int position, long id) {
                    Intent videoDisplayIntent =  new Intent("com.test.utubevdo.VIEW_VIDEO");
                    System.out.println("String.valueOf(view.getTag())  :::"+((YTBVideo)videos.get(position)).getId());
                    videoDisplayIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    videoDisplayIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                    videoDisplayIntent.putExtra("VIDEO_ID", ((YTBVideo)videos.get(position)).getId());
                    startActivity(videoDisplayIntent);
                }
                });
        progressDialog = ProgressDialog.show(this, "Loading Video Images", "Loading Video Images", true, false);
        //  setListAdapter(new MyThumbnaildapter(AndroidThumbnailList.this, R.layout.row, videoFileList));
    }


    /*@Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        // TODO Auto-generated method stub
        super.onCreateContextMenu(menu, v, menuInfo);

    }*/

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        try{
            DownloaderTAsk downloaderTAsk = (DownloaderTAsk) new DownloaderTAsk().execute(getApplicationContext());


        }catch (Exception e) {
            // TODO: handle exception
        }
    }


    class DownloaderTAsk extends AsyncTask{

        @Override
        protected Object doInBackground(Object... arg0) {
            // TODO Auto-generated method stub
            try{
                printVideoFEEJSONString("http://gdata.youtube.com/feeds/api/videos?alt=jsonc&q=football+-soccer&orderby=published&start-index=11&max-results=10&v=2");
                //printVideoFEEJSONString("https://gdata.youtube.com/feeds/api/videos?alt=json&q=football+-soccer&orderby=published&start-index=11&max-results=10&v=2");
                imageLoaderHandler.sendEmptyMessage(0);
            }catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();

                imageLoaderHandler.sendEmptyMessage(1);

            }
            return null;
        }
        @Override
        protected void onPostExecute(Object result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);

        }

    }



    public void printVideoFEEJSONString(String feedURL){
        BufferedReader bufferedReader = null;
        try{
            HttpClient client = new DefaultHttpClient();

            HttpGet request = new HttpGet(feedURL);
            HttpResponse response = client.execute(request);

            bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuffer jsonStringBuffer = new StringBuffer("");
            String line = "";
            String newLine = System.getProperty("line.separator");
            while ((line = bufferedReader.readLine()) != null) {
                jsonStringBuffer.append(line + newLine);
            }

            String appUpdatorJsonString = jsonStringBuffer.toString();
            System.out.println("YOUTUBE VIDEO FEED JSON :"+appUpdatorJsonString);

            JSONObject updaterAppJsonObject = new JSONObject(appUpdatorJsonString);
            System.out.println("YOUTUBE VIDEO FEED JSON OBJECT :"+updaterAppJsonObject);




            processYoutubeVideoFEEJSONObject(updaterAppJsonObject);



        }catch (Exception e) {
            e.printStackTrace();
            // TODO: handle exception
        }
    }


    public void processYoutubeVideoFEEJSONObject(JSONObject updaterAppJsonObject){
        JSONObject dataJSONObject = null;
        JSONArray itemsJSONArray = null;
        JSONObject itemsJSONObject = null;
        JSONObject linkJSONObject = null;
        String yvURL = "";
        YTBVideo yVideo = null;

        try{

            dataJSONObject = updaterAppJsonObject.getJSONObject("data");
            itemsJSONArray = dataJSONObject.getJSONArray("items");
            for(int i = 0; i < itemsJSONArray.length(); i++){
                yVideo = new YTBVideo();
                // for(int i = 0; i < 1; i++){
                itemsJSONObject = itemsJSONArray.getJSONObject(i);
                yVideo.setId(itemsJSONObject.getString("id"));
                yVideo.setThumbNailURL(itemsJSONObject.getJSONObject("thumbnail").getString("sqDefault"));
                yVideo.setVideoImageURL(itemsJSONObject.getJSONObject("player").getString("default"));
                yVideo.setTitle(itemsJSONObject.getString("title"));
                yvURL = itemsJSONObject.getJSONObject("player").getString("default");


                String videoURL = yvURL.substring(0,yvURL.indexOf("&"));
                vdoURL = videoURL;
                System.out.println("Youtube URL is ::"+videoURL);
                System.out.println("videoURL ::"+videoURL);
                yVideo.setThumbnailImage(preloadBitmap(yVideo));
                videos.add(yVideo);

            }

        }catch (Exception e) {
            e.printStackTrace();
            // TODO: handle exception
        }
    }



    private Bitmap preloadBitmap(YTBVideo  yTBVideo) throws MalformedURLException,IOException {
        Bitmap photoBitmap= null;
        try{

        BitmapFactory.Options  imageOptions = null;
        imageOptions = new BitmapFactory.Options();
        imageOptions.outHeight = 250;
        imageOptions.outHeight = 150;
        String FlickrPhotoPath = yTBVideo.getThumbNailURL();


        URL FlickrPhotoUrl = null;


        System.out.println("FlickrPhotoPath:::::::"+FlickrPhotoPath);
        //try {
        FlickrPhotoUrl = new URL(FlickrPhotoPath);

        HttpURLConnection httpConnection = (HttpURLConnection) FlickrPhotoUrl.openConnection();
        httpConnection.setDoInput(true);
        httpConnection.connect();
        InputStream inputStream = httpConnection.getInputStream();
        //photoBitmap = BitmapFactory.decodeStream(inputStream);
        photoBitmap = BitmapFactory.decodeStream(inputStream,null,imageOptions);
        System.out.println("photoBitmap:::::::"+photoBitmap);
        /*} catch (MalformedURLException e) {
                //e.printStackTrace();
            } catch (IOException e) {
                //e.printStackTrace();
            }*/
        }catch (Exception e) {
            // TODO: handle exception
            //showErrorMessage("communication error", "Unable to connect to Flickr Server");
            e.printStackTrace();
        }
        return photoBitmap;
    }

    protected void showErrorMessage(String messageLine1, String message)
    {       
        noDataAlert = Utiliy.getAlertMessage(getBaseContext(), this, messageLine1.toUpperCase()+":\n"+message, 1);
        noDataAlert.getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        noDataAlert.setCanceledOnTouchOutside(true);
        noDataAlert.setCancelable(true);
        Button yesButton = (Button)noDataAlert.findViewById(R.id.alert_popup_yes_button);
        yesButton.setText("  OK  ");
        yesButton.setTextSize(24);
        yesButton.setPadding(5, 5, 5, 5);
        yesButton.setVisibility(View.VISIBLE);
        yesButton.setOnClickListener(new OnClickListener(){
            public void onClick(View view){
                noDataAlert.dismiss();
                finish();
            }
        });
        noDataAlert.show();
    }
}

 package com.test.utubevdo;

    import java.util.List;

    import com.keyes.youtube.OpenYouTubePlayerActivity;

    import android.app.Activity;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.content.pm.ResolveInfo;
    import android.net.Uri;
    import android.os.Bundle;

    public class DisplayYoutubeVideo extends Activity {

    String vdoID = "";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        vdoID = (String) getIntent().getExtras().get("VIDEO_ID");

        System.out.println("vdoID   :::"+vdoID);
    }
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        startVideo(vdoID);
    }


    private void startVideo ( String videoID ) { // default youtube app
        Intent i = new Intent ( Intent . ACTION_VIEW , Uri . parse ( "vnd.youtube:" + videoID )); 
        List < ResolveInfo > list = getPackageManager (). queryIntentActivities ( i , PackageManager . MATCH_DEFAULT_ONLY ); 
        if ( list . size () == 0 ) {
            //write you own activity to display the video, if default youtube video display class is not available or else use the default class it self
            }

        System.out.println("Intent Actin :"+i.getAction());
        startActivity ( i );
    }
}

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.test.utubevdo"
      android:versionCode="1"
      android:versionName="1.0">

        <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />


    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8"/>


    <application android:icon="@drawable/icon" android:label="@string/app_name">

  <activity android:name="com.test.utubevdo.AndroidThumbnailList"
                  android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

  <activity android:name="com.test.utubevdo.DisplayYoutubeVideo"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.test.utubevdo.VIEW_VIDEO" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>

</manifest> 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ListView 中显示的 YouTube 播放列表 的相关文章

  • 我可以为 Android Activity 分配“默认”OnClickListener() 吗?

    我有一个 Activity 对于布局中的每个小部件 我调用 setOnClickListener 来分配我的 OnClick 处理程序 在我的 OnClick 处理程序中 我使用 switch 语句根据 View 参数的 ID 为每个按钮执
  • Android Wear - 在没有 WearableListenerService 的情况下从 Wear 接收消息?

    我正在开发一款适用于 Android Wear 的应用程序 它可以在手机上启动活动 一切都很好 但我不想依赖手机上不断运行的后台服务来接收此消息 理想情况下 我会让 WearableListenerService 与应用程序同时启动 并保持
  • 相机预览的有效模糊

    到目前为止我尝试过的 将每一帧转换为位图 然后用library https github com wasabeef Blurry并将其放入ImageView这是在相机预览前 显然太慢了 就像1 fps 然后我开始使用渲染脚本这会模糊每一帧
  • Android布局中如何实现Button的自动宽度

    我有几个垂直列出的按钮 我需要它们都具有相同的宽度 而且还要显示其中的所有文本 基本上我需要所有它们的宽度作为最大的宽度的包裹宽度 希望我解释得很好 现在 我已经有一种布局可以在我的 Samsung Galaxy S2 4 1 2 上运行
  • Android:如何根据视图模型实时数据属性为片段编写单元测试?

    我的片段 UI 中有一个列表视图 其元素集取决于来自视图模型 LiveData 属性的值的状态 我想为片段创建工具测试 该片段包含与该属性的值集相关的 3 个场景测试用例 但我不知道从哪里开始 我的代码应该如下所示 class MyView
  • 删除所有(子)片段的正确方法

    我在父级片段线性布局 fragmentContainer 中动态加载一堆子级片段 然后当用户单击按钮时 我需要将它们全部删除并添加新的 我不知道每次会添加多少碎片 这是我一次性删除所有碎片的方法 LinearLayout ll Linear
  • 在 Android Studio 中使用预构建的共享库

    我需要在我的 android 项目中使用自定义的预构建共享库 在独立 ndk 上构建为 libdynamic so 我在路径 src main 中创建了一个文件夹 jniLibs 然后在其中创建了 4 个文件夹 即 armeabi arme
  • 为什么大多数 Android 设备不像典型操作系统那样有交换区域?

    现在有 Android 支持交换区域来提高性能吗 出于哪些考虑 大多数 Android 设备放弃了该功能 现在有 Android 支持交换区域吗 Quoting 黛安 哈克伯恩 https groups google com d msg a
  • 没有 Listview 的 Android 导航抽屉

    我想创建一个像导航抽屉一样的滑动菜单 但是将会有文本视图和图像视图 就像半活动一样 有可能做到这一点吗 您可以使用NavigationDrawer来自支持库 包括一个FrameLayout作为一个孩子DrawerLayout并使androi
  • 带有可点击区域的 Android 图像

    我需要建议如何在 Android 下实现以下功能 我需要一个表示类似于图形 来自离散数学 的图像 具有顶点和边缘 我可以在其中单击每个顶点或边缘并触发不同的操作 请告诉我如何实现这一目标 也许与imagebuttons 或另一种表示此功能的
  • Android:如何停止监听电话监听器? [复制]

    这个问题在这里已经有答案了 可能的重复 Android 为什么 PhoneCallListener 在活动完成后仍然存在 https stackoverflow com questions 11666853 android why phon
  • 超慢的表格布局性能

    我遇到了糟糕的 TableLayout 性能 我在这里读过一些帖子 谈论同样的事情 Android 动态创建表 性能不佳 https stackoverflow com questions 9813427 android dynamical
  • Android:列表视图崩溃

    我正在使用 android listview 并且它工作得很好 我的实现如下 ListView listview ListView findViewById R id list setListAdapter new ArrayAdapter
  • Android 预安装检测

    我的 Android 应用程序将被预安装 我想继续跟踪预安装的应用程序 为此 我需要以某种方式保存密钥或标志 这意味着该应用程序是预安装的 我会将此密钥添加到后端的每个请求中并对其进行分析 我对此有疑问 有一个问题是关于从 Google P
  • Android studio 问题:找不到广告:AdQuality:未指定

    我已经更新了 Android studio 刚刚打开我的项目 我收到以下错误 您能让我知道如何解决这个问题吗 Error A problem occurred configuring project memoryGameCollection
  • Android JobScheduler 每天只运行一次

    我检查了 JobScheduler API 它可以从 Android API 级别 21 开始使用 我想安排一个需要互联网并且每天仅运行一次或可选每周运行一次的任务 如果成功执行 我没有找到关于这种情况的例子 有人能帮我吗 谢谢 针对您的问
  • 膨胀类 android.support.design.internal.BottomNavigationView 时出错

    我正在制作我的第一个应用程序 这是一个简单的应用程序 带有启动屏幕和主要活动 现在我有两个构建变体 免费版本 活动底部有 Admob 横幅 付费版本 该应用程序不会在底部显示 admob 横幅 而是将其替换为用于切换活动的底部导航视图 我将
  • OnSwipe 方法在 RecyclerView 中不起作用

    我正在开发一个用于播放音频文件的应用程序 创建了包含 2 个选项卡的选项卡布局 两者中都使用了片段RecyclerView两者都被使用 该片段名为LibraryFragment有这个RecycleView其物品在刷卡时必须传递给HomeFr
  • 智能手机可以通过 3G/4G 进行点对点通信吗?

    我正在尝试编写一个应用程序 将数据从一个 Android 设备传输到另一个 Android 设备 但这些设备很可能位于城市 州或国家的不同部分 直接的方法是拥有一台中央服务器 或任何类型的服务器 但我试图避免使用中央服务器 我试图传递的数据
  • 如何在不显示父活动的情况下将一个全屏对话框片段替换为另一个全屏对话框片段?

    我有一个使用单个自定义 DialogFragment 类的活动 它的外观是数据驱动的 因此不同的调用看起来可能相当不同 它是 全屏 即 setStyle DialogFragment STYLE NO FRAME android R sty

随机推荐

  • 向JTable添加加载循环

    我有一个从数据库加载数据的 JTable 因为有时数据太多 我想在Jtable内添加一个加载圆圈来通知用户数据正在加载 这是我希望的图像 这可能吗 在 Swing 中如何实现呢 PS 我不想使用进度条 我只想使用表格内的圆圈 UPDATE
  • 为什么在 LIKE 过滤器中使用下划线字符会给出所有结果?

    我写了下面的 SQL 查询LIKE健康 状况 SELECT FROM Manager WHERE managerid LIKE AND managername LIKE In the LIKE我想搜索任何下划线 但我知道我的列数据没有下划线
  • 使行延伸到 CSS 网格中的所有列

    尽管我已经指定了我希望导航延伸到哪些列 但我一直无法让我的导航完全延伸到我的列上 如果您可以看一下我的代码并指出我的错误太棒了 这是浏览器中 HTML 文件的图像 body margin 0 padding 0 container max
  • 将 datetimepicker 连接到 angularjs

    我需要使用 Angular Bootstrap 创建一个包含日期和时间的输入字段 我找到了这个日期时间选择器它看起来正是我需要的 一个字段中的日期和时间 并阻止用户错误的版本 我写了一个指令 datepickers 启动了 但它改变了视图
  • 为什么分配给 True/False 不能按我的预期工作?

    作为回答另一个问题的一部分 我编写了以下代码 乍一看其行为似乎很奇怪 print True outputs true True False print True outputs false True True print True outp
  • 谷歌地图反应没有出现

    我正在尝试使用google map react 但是当我尝试渲染它时 什么也没有出现 我错过了什么吗 import GoogleMap from google map react import React Component from re
  • 如何在Google App Engine中导入Google Cloud语音识别(python)

    我想在我的 Google App Engine python 应用程序上使用 google cloud 库 自从我在本地安装了这个库以来 我的所有测试都在我的本地工作 我原以为 GAE 默认支持它 但它是不支持 这是我得到的错误 from
  • 如何使用 Selenium RC 来验证我们的服务器端重定向(301、302)?

    我们的 Apache 配置中有很多重定向 我想用 Selenium 自动测试重定向 这导致我遇到了一些问题 调用 URL 但在重定向页面上断言 重定向后检查浏览器的URL 检查响应标头 以确定重定向类型 301 302 也许 Seleniu
  • 如何从一个类运行多个控制台?

    我有三个课程 它们都有不同的作品 但我需要一起运行它们 当我在一个类中运行所有这些时 我只得到一个控制台 并且无法更改此控制台 我想要的是在一个类中运行它们并查看每个控制台 我怎样才能做到这一点 更清楚地说 when I run first
  • 类型擦除的通用包装器是如何实现的?

    我需要为我自己的结构实现一个类型擦除包装器 非常类似于SequenceOf GeneratorOf等等 所以我开始尝试重新实现标准SequenceOf myself 我刚刚复制并粘贴了声明SequenceOf 将其重命名为MySequenc
  • 无法访问 Android 中的传感器

    我正在编写一个指南针应用程序 但由于某种原因无法访问所需的传感器 我已经实施了SensorEventListener以这种方式连接并注册我的传感器 sensorManager SensorManager getSystemService C
  • 为什么枚举已安装的 MSI 包如此慢?

    这是此的后续question 我使用这个稍微修改过的脚本来枚举所有已安装的 MSI 包 strComputer Set objWMIService GetObject winmgmts impersonationLevel imperson
  • 比较 2 个 CSV 文件并写下所有差异

    我有 3 个包含用户信息的 CSV 文件 CSV1 是所有非活动用户的 主 列表 CSV2 是需要停用的当前用户列表 CSV3 是需要激活的用户列表 我想要的是有一个可以从另一个脚本 创建 CSV2 3 的脚本 调用的 PowerShell
  • 在 C# 的类构造函数中调用异步方法[重复]

    这个问题在这里已经有答案了 目前我正在使用 C 开发一个通用应用程序 在应用程序中 我使用 sqlite 作为数据库 正如您现在可能的那样 它具有异步方法 我有一个带有一些 null 属性的类 我将使用从数据库获取的数据来填充它们 但它应该
  • 如何使用phonegap/jQueryMobile从OpenCart获取JSON格式的产品

    无论如何 是否可以使用 Ajax JavaScript jQuery 从我的 OpenCart 商店中从 PhoneGap 移动应用程序获取 JSON 格式的产品目录 OpenCart 允许这样的事情吗 欢迎任何想法或代码 OcJoy 进展
  • 使用 Json 数据改造 POST 方法收到错误代码 400:错误请求

    我想使用 JSON 数据 提供 JSON 作为 JsonObject 在 Retrofit 中调用 POST 方法 Magento REST API 为此 我按照邮递员的要求拨打电话 对我来说工作得很好 我已经完成了 android 部分如
  • 重写我的分数文本文件以确保它只有最后 4 个分数 (python)

    以前 在 SO 用户的帮助下 我已经能够找到如何使用字典中的 maxlength 属性在 Python 文档中存储最多 4 个键 现在 我想走得更远 下面是一个包含所有内容的文本文件recent我的参与者 戴夫 杰克和亚当 Jack 10
  • 检索插入行的索引

    我试图使我正在处理的项目的数据库表保持良好和规范化 但我遇到了问题 我试图弄清楚如何在表中插入一行 然后找出 auto incremented 的值id列设置为以便我可以将附加数据插入到另一个表中 我知道有这样的功能mysql insert
  • 通常是什么导致haskell中出现“错误C堆栈溢出”

    Hugs Haskell 实现中 错误 C 堆栈溢出 的常见原因是什么 如果您习惯于通常进行尾递归分解的函数式语言 则可能会出现这种情况 假设你有一个函数 sum go 0 where go accum accum go accum x x
  • ListView 中显示的 YouTube 播放列表

    我有一个GDATA我想在我的应用程序中使用的链接 此链接包含一个播放列表 我希望该播放列表显示在ListView 然后 用户将选择他 她想要的视频 然后就可以使用本地 Youtube 应用程序在应用程序中播放该视频 请给我指出一个直观的教程