将 Youtube Gdata json 解析为 ListView [英] Parsing Youtube Gdata json into ListView

查看:17
本文介绍了将 Youtube Gdata json 解析为 ListView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直试图找到一个解析 Youtube Gdata JSON"的工作示例.在 Android 中填充列表视图.

I have been trying to find a working example of "Parsing Youtube Gdata JSON" in Android to populate a listview.

我一直在阅读这个问题,除了4个错误..

I have been reading this question, and I almost have it working except for 4 errors..

  1. item_title

  1. item_title

item_subtitle

item_subtitle

setListAdapter

setListAdapter

getListView

getListView

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;

public class listview extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listview_main);

ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

//Get the data (see above)
JSONObject json = getJSON.getJSONfromURL("https://gdata.youtube.com/feeds/api/videos?q=random&max-results=50&v=2&alt=jsonc");


try{



    final JSONArray array = json.getJSONArray("items");

    //Loop the Array
    for(int i=0;i < array.length();i++){

        HashMap<String, String> map = new HashMap<String, String>();
        JSONObject e = array.getJSONObject(i);

        map.put("id",  String.valueOf(i));
        map.put("title", "" + e.getString("title"));
        map.put("viewCount", "Views: " +  e.getString("viewCount"));
        mylist.add(map);
    }
}catch(JSONException e)        {
    Log.e("log_tag", "Error parsing data " + e.toString());
}

       ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.dubstep,
               new String[] { "title", "viewCount" },
               new int[] { R.id.item_title, R.id.item_subtitle });

setListAdapter(adapter);

final ListView lv = getListView();
//final ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        @SuppressWarnings("unchecked")
        HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);
        Toast.makeText(listview.this, "ID '" + o.get("id") + "' was clicked.", Toast.LENGTH_SHORT).show();

    }
});

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.listview, menu);
    return true;
    }
}

它说"无法解析符号'item_title'和'item_subtitle'
"无法解析方法'setListAdapter(android.widget.ListAdapter)'

感谢任何帮助,谢谢!

推荐答案

您的活动类不扩展 ListActivity.因此错误 3 和 4

Your activity class does not extend ListActivity. Hence the errors 3 and 4

您应该使用 AsyncTask 进行网络相关操作.您不能在主 ui 线程上运行网络相关操作.

You should use AsyncTask for network related operation. You cannot run network related operation on the main ui thread.

您应该对图像使用延迟加载.但是对于示例,我使用了位图的 ArrayList 作为缩略图.您可能会遇到内存泄漏.所以使用延迟加载.根据您的要求修改以下内容.

You should use lazy loading for images. But for sample i have use a ArrayList of bitmaps for thumbnail. You might run into memory leaks. So use lazy loading. Modify the below according to your requirement.

示例:

public class MainActivity extends Activity {

    Button b;
    ListView lv;
    ArrayList<String> msg = new ArrayList<String>();
    ArrayList<String> title = new ArrayList<String>();
    ArrayList<Bitmap> thumb = new ArrayList<Bitmap>();
    ProgressDialog pd;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv= (ListView) findViewById(R.id.lv);
        pd = new ProgressDialog(MainActivity.this);
        pd.setTitle("Loading..");
        b= (Button) findViewById(R.id.button1);
        b.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new TheTask().execute();
            }

       });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    public void getData()
    {
        HttpClient httpclient = new DefaultHttpClient();
        httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
        HttpGet request = new HttpGet("https://gdata.youtube.com/feeds/api/videos?q=random&max-results=50&v=2&alt=jsonc");
        // HttpGet request = new HttpGet("http://gdata.youtube.com/feeds/api/users/mbbangalore/uploads?v=2&alt=jsonc");     
        try
        {
        HttpResponse response = httpclient.execute(request);
        HttpEntity resEntity = response.getEntity();
        String _response=EntityUtils.toString(resEntity); // content will be consume only once

        JSONObject json = new JSONObject(_response);

        JSONArray jsonArray = json.getJSONObject("data").getJSONArray("items");
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);

            String title1 = jsonObject.getString("title");
            title.add(title1);
            String thumbUrl = jsonObject.getJSONObject("thumbnail").getString("sqDefault");
            URL url1 = new URL(thumbUrl);
            Bitmap bmp = BitmapFactory.decodeStream(url1.openConnection().getInputStream());
            thumb.add(bmp);
            String url;
            try {

                url = jsonObject.getJSONObject("player").getString("default");
                msg.add(url);
            } catch (JSONException ignore) {
            }
        }
        } 
        catch(Exception e1)
            {
                e1.printStackTrace();
            }

        httpclient.getConnectionManager().shutdown();
    }
  class TheTask extends AsyncTask<Void,Void,Void>
  {

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        pd.dismiss();
        YouTubeAdapter you = new YouTubeAdapter(MainActivity.this,msg,title,thumb);
        lv.setAdapter(you);
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        pd.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        getData();
        return null;
    }

  }
}

activity_main.xml

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ListView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/lv"
        android:layout_above="@+id/button1"
       />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="Button" />

</RelativeLayout>

YouTube 适配器

YouTubeAdapter

public class YouTubeAdapter extends BaseAdapter{

    Context mContext;
    Intent intent;
    LayoutInflater mInflater;
    ArrayList<String> mVideo= new ArrayList<String>();
    ArrayList<String> mTitle= new ArrayList<String>();
    ArrayList<Bitmap> mThumb= new ArrayList<Bitmap>();

    public YouTubeAdapter(Context context,ArrayList<String> a,ArrayList title,ArrayList thumb)  {
        mContext=context;
        mVideo=a;   
        mTitle = title;
        mThumb= thumb;
        mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mVideo.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(final int position, View arg1, ViewGroup arg2) {
        ViewHolder vh;

        if(arg1==null)
        {
            arg1=mInflater.inflate(R.layout.video, null);
            vh= new ViewHolder();
            vh.tv=(TextView)arg1.findViewById(R.id.tvv);
            vh.iv=(ImageView)arg1.findViewById(R.id.ivv);
            arg1.setTag(vh);
        }
        else
        {
            vh= (ViewHolder)arg1.getTag();
        }
        vh.tv.setText(mTitle.get(position));
        vh.iv.setImageBitmap(mThumb.get(position));
        return arg1;
    }

    static class ViewHolder
    {
        TextView tv;
        ImageView iv;
    }   
}

video.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
     >

    <TextView
        android:id="@+id/tvv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textColor="#000000"
        android:textSize="13dp" />

    <ImageView
        android:id="@+id/ivv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</LinearLayout>

快照

这篇关于将 Youtube Gdata json 解析为 ListView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆