如何在LISTVIEW中显示JSON数据

时间:2015-11-29 18:23:14

标签: android json listview

我有来自YouTube的JSON数据。我想在LIST VIEW中显示数据。但是当我运行我的代码时,我得到一个空白页面。但我有YouTube DATA API的回复。我该如何解决?

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 "";
        }

    }

1 个答案:

答案 0 :(得分: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

相关问题