2013-06-27 47 views
0

我一直在試圖在Android中查找「分析Youtube Gdata JSON」的工作示例來填充列表視圖。解析Youtube Gdata json到ListView中

我一直在閱讀this question,和我差不多有工作,除了4個錯誤..

  1. ITEM_TITLE
  2. item_subtitle
  3. setListAdapter
  4. 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; 
        } 
    } 
    

它說"Cannot resolve symbol 'item_title' and 'item_subtitle'
"Cannot resolve method 'setListAdapter(android.widget.ListAdapter)'

任何幫助表示讚賞,謝謝!

+0

哪裏是'item_title'在你的代碼?你可以發佈相同的嗎?發佈一些更相關的代碼。 – Raghunandan

+0

您的意思是? 'new int [] {R.id.item_title,R.id.item_subtitle});' –

+0

發佈整個代碼和堆棧跟蹤。 – Raghunandan

回答

5

您的活動類不會擴展ListActivity。因此,錯誤3和4

您應該使用AsyncTask進行網絡相關操作。您不能在主UI線程上運行網絡相關操作。

您應該使用延遲加載圖像。但是對於示例,我使用位圖的ArrayList作爲縮略圖。你可能會遇到內存泄漏。所以使用延遲加載。根據您的要求修改以下內容。

實施例:

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中

<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> 

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> 

快照

enter image description here

+0

雖然我得到這些錯誤.. '無法找到符號變量tvv','找不到符號變量ivv'和'無法找到符號可變視頻'我在佈局文件夾中創建了'video.xml' –

+0

@RobertdeJonge它是'video.xml'中的textview。所以,檢查是否有video.xml和textviews內他們 – Raghunandan

+0

@RobertdeJonge創建您的res文件夾一個文件'video.xml'並粘貼上面的'video.xml'代碼裏面 – Raghunandan