2015-11-29 3 views
2

У меня есть данные JSON от YouTube. Я хочу показать данные в LIST VIEW. Но когда я запускаю свой код, я получаю пустую страницу. Но у меня есть ответ API DATA YouTube. Как я могу это решить?Как показать JSON DATA в LISTVIEW

public class MainActivity extends ListActivity { 

    private ProgressDialog pDialog; 

    // URL to get contacts JSON 
    private static String url = "https://www.googleapis.com/youtube/v3/search?part=snippet&maxResult=30&q=natok+bangla+mosharrof+karim&key=AIzaSyCR40QlsuX0aFfBV-wEPDsH_jxna1tDFRA"; 

    private static final String TAG_ITEMS = "items"; 
    private static final String TAG_ID = "id"; 
    private static final String TAG_ID_VIDEOID = "vid"; 
    private static final String TAG_TITLE = "title"; 
    private static final String TAG_DESCRIPTION = "description"; 
    private static final String YouTubeThumbnail = "https://i.ytimg.com/vi/hlaX2OZ_kDg/default.jpg"; 
    private static final String TAG_CHANNELTITLE = "channelTitle"; 

    JSONArray items = null; 


    // Hashmap for ListView 
    ArrayList<HashMap<String, String>> dataList; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     dataList = new ArrayList<HashMap<String, String>>(); 

     ListView lv = getListView(); 

     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) { 
       // getting values from selected ListItem 
       String vid = ((TextView) view.findViewById(R.id.name)) 
         .getText().toString(); 
       String title = ((TextView) view.findViewById(R.id.email)) 
         .getText().toString(); 
       String description = ((TextView) view.findViewById(R.id.mobile)) 
         .getText().toString(); 

       // Starting single contact activity 
       Intent in = new Intent(getApplicationContext(), 
         SingleContactActivity.class); 
       in.putExtra(TAG_ID_VIDEOID, vid); 
       in.putExtra(TAG_TITLE, title); 
       in.putExtra(TAG_DESCRIPTION, description); 
       startActivity(in); 

      } 
     }); 

     new GetContacts().execute(); 
    } 
    private class GetContacts extends AsyncTask<Void, Void, Boolean> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // Showing progress dialog 
      pDialog = new ProgressDialog(MainActivity.this); 
      pDialog.setMessage("Please wait..."); 
      pDialog.setCancelable(false); 
      pDialog.show(); 

     } 

     @Override 
     protected Boolean doInBackground(Void... arg0) { 
      // Creating service handler class instance 
      ServiceHandler sh = new ServiceHandler(); 

      // Making a request to url and getting response 
      String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET); 

      Log.d("Response: ", "> " + jsonStr); 

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


      int count = 0; 
      try { 
       JSONObject js = new JSONObject(jsonStr); 



       JSONArray jsItem = js.getJSONArray("items"); 
       for (int i = 0; i < jsItem.length(); i++) { 
        JSONObject item = jsItem.getJSONObject(i); 
        JSONObject vid =item.getJSONObject("id"); 

        String videoId = getStringResult(vid.toString(), "videoId"); 

        if (!videoId.equalsIgnoreCase("")) 
        { 
         JSONObject snippet =item.getJSONObject("snippet"); 
         String title = sh.getStringResult(snippet.toString(), "title"); 

         HashMap<String, String> map = new HashMap<String, String>(); 
         map.put("name", title); 
         map.put("vid", videoId); 
         map.put ("img","http://img.youtube.com/vi/" + videoId + "/hqdefault.jpg"); 
         map.put ("id",++count+""); 


         dataList.add(map); 

        } 

       } 

      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return true; 
     } 
     @Override 
     protected void onPostExecute(Boolean result) { 
      super.onPostExecute(result); 
      // Dismiss the progress dialog 
      if (pDialog.isShowing()) 
       pDialog.dismiss(); 
      /** 
      * Updating parsed JSON data into ListView 
      * */ 
      ListAdapter adapter = new SimpleAdapter(
        MainActivity.this, dataList,R.layout.list_item, new String[] { TAG_TITLE, TAG_DESCRIPTION, 
        TAG_CHANNELTITLE }, new int[] { R.id.name, 
        R.id.email, R.id.mobile }); 

      setListAdapter(adapter); 
     } 

    } 

    public String getStringResult(String data, String node) { 

     try { 
      JSONObject js = new JSONObject(data); 

      return js.getString(node); 

     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      return ""; 
     } 

    } 

ответ

0

Использовать notifyDataSetChanged(). Это уведомляет об изменении данных и обновляет представление списка. LINK

Вот изменения, которые помогут:

public class MainActivity extends ListActivity { 

    ... 
    ListAdapter adapter = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     ... 
     ListView lv = getListView(); 
     adapter = new SimpleAdapter(
        MainActivity.this, dataList,R.layout.list_item, new String[] { TAG_TITLE, TAG_DESCRIPTION, 
        TAG_CHANNELTITLE }, new int[] { R.id.name, 
        R.id.email, R.id.mobile }); 
     lv.setListAdapter(adapter); 
     ... 
    } 
    private class GetContacts extends AsyncTask<Void, Void, Boolean> { 

     @Override 
     protected void onPreExecute() { 
      ... 
     } 

     @Override 
     protected Boolean doInBackground(Void... arg0) { 
      ... 
     } 
     @Override 
     protected void onPostExecute(Boolean result) { 
      if(adapter ! = null) { 
       adapter.notifyDataSetChanged(); 
     } 

    } 

    public String getStringResult(String data, String node) { 
     ... 
    } 

Объяснение:

  • ListAdapter является мостом между ListView и данных, примыкающим список.
  • Всякий раз, когда данные изменяются, адаптер отвечает за уведомление об измененных данных, и, следовательно, представление обновляется новыми данными. Это достигается notifyDataSetChanged().

Для получения более подробной информации, пожалуйста, пройдите через это link.

+0

«...» является заменой фактического кода. Поэтому просто добавьте изменения в фактический код. – thepace

+0

может у вас объяснить весь код? –

+0

Сообщите мне, если код работает. Я обновил ссылку на то, что делает notifyDataSetChanged(). Добавит объяснение к сегодняшнему дню. – thepace

Смежные вопросы