Tries to parse json for list view on android but get error

I am creating an application that fetches json from my sites and parses that json on a listview on android.

I get json using http request then create 2 website arrays to store all site names and links to store links. I need the list to show the site names and clicking then open the website in a browser.

Can anyone help me. Tried everything I could. Help me figure out the problem or tell me another way to do it.

Trying to get json and parse it in listView Below is my code:

public class GetWebsiteList extends AsyncTask<String, String, String> {
        // Creating JSON Parser object

        ArrayList<HashMap<String, String>> productsList;
        String websites[]=new String[10];
        String links[]=new String[10];
        // url to get all products list
        private String url_all_products = "http://androidtest.cu.cc/getwebsites.php";

        // JSON Node names
        private static final String TAG_SUCCESS = "success";
        private static final String TAG_WEBSITES = "websites";
        private static final String TAG_SNO = "sno";
        private static final String TAG_NAME = "name";
        private static final String TAG_LINK = "link";
        // products JSONArray
        JSONArray products = null;
        // Progress Dialog
        private ProgressDialog pDialog;

        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(mainpage.this);
            pDialog.setMessage("Loading Website List.Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @Override
        protected String doInBackground(String... arg0) {
// Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            JSONParser jParser = new JSONParser();
            // getting JSON string from URL
            JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params);
            //ArrayAdapter adapter = ArrayAdapter.
            // Check your log cat for JSON reponse
            Log.d("nitrek All Products: ", json.toString());

            try {
                // Checking for SUCCESS TAG
                int success = json.getInt(TAG_SUCCESS);
                String suc;
                switch(success)
                {
                    case 1:
                        suc="True";
                        break;
                    case 0:
                        suc="False";
                        break;
                    default:
                        suc="unkonwn";
                        break;
                }

                if (success == 1) {
                    // products found
                    // Getting Array of Products
                    Log.d(" nitrek success",suc);
                    products = json.getJSONArray(TAG_WEBSITES);
                    // looping through All Products
                    Log.d(" nitrek websites", products.toString());
                    for (int i = 0; i < products.length(); i++) {
                        JSONObject c = products.getJSONObject(i);
                        // Storing each json item in variable
                        String id = c.getString(TAG_SNO);
                        String name = c.getString(TAG_NAME);
                        String link= c.getString(TAG_LINK);
                        Log.d("nitrek website",id+name+link);
                       // websites[i]=new String();
                        websites[i]=name;
                        links[i]=link;
                        Log.d("nitrek web",websites[i]+links[i]);
                        /* creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();
                        // adding each child node to HashMap key => value
                       try {
                           map.put(TAG_SNO, id);
                           map.put(TAG_NAME, name);
                           productsList.add(map);
                       }
                       catch (Exception e)
                       {
                           e.printStackTrace();
                       }
                        // adding HashList to ArrayList
                        */
                    }
                } else {
                    // no products found
                    // Launch Add New product Activity
                    Toast.makeText(mainpage.this,"no website found", Toast.LENGTH_LONG).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(final String result) {
            pDialog.dismiss();

            runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Updating parsed JSON data into ListView
                     */
                    //ListAdapter adapter = new SimpleAdapter(mainpage.this, productsList, R.layout.listitem, new String[]{TAG_SNO, TAG_NAME},new int[]{R.id.sno, R.id.name});
                    // updating listview
                    try {
                        //ArrayAdapter<String> adapter = new ArrayAdapter<String>(mainpage.this, R.layout.listitem, R.id.name, websites);

                        final ArrayList<String> list = new ArrayList<String>();
                        for (int i = 0; i < websites.length; ++i) {
                            list.add(websites[i]);
                        }
                        final StableArrayAdapter adapter = new StableArrayAdapter(mainpage.this, R.layout.listitem, list);
                        //ArrayAdapter<String> ad = new ArrayAdapter<String>(mainpage.this, R.layout.listitem, websites);
                        ListView lv = (ListView) findViewById(R.id.list);
                        lv.setAdapter(adapter);
                        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                            @Override
                            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                                //Intent intent = new Intent(this, homepage.class);
                                count = 0;
                                String url = links[position];
                                Toast.makeText(mainpage.this, "Opening: " + url, Toast.LENGTH_SHORT).show();
                                Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                                //notify_test(url);
                                startActivity(i);

                            }
                        });
                    } catch (Exception e) {
                        Log.d("error list nitrekerror", "below");
                        e.printStackTrace();
                    }
                    Toast.makeText(mainpage.this, result, Toast.LENGTH_LONG).show();

                    int i = 0;
                    while (i < websites.length && i < 3) {
                        Toast.makeText(mainpage.this, websites[i] + " " + links[i], Toast.LENGTH_LONG).show();
                        i++;
                    }
                }
            });
        }
    }
    private class StableArrayAdapter extends ArrayAdapter<String> {

        HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

        public StableArrayAdapter(Context context, int textViewResourceId,
                                  List<String> objects) {
            super(context, textViewResourceId, objects);
            for (int i = 0; i < objects.size(); ++i) {
                mIdMap.put(objects.get(i), i);
            }
        }

        @Override
        public long getItemId(int position) {
            String item = getItem(position);
            return mIdMap.get(item);
        }

        @Override
        public boolean hasStableIds() {
            return true;
        }

    }

      

but i get this error and can't figure out why? Below is the logcat:

07-08 00:58:34.245  27826-27826/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: nitz.nitrek.myrtoguide, PID: 27826
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
            at   android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java)
            at android.widget.ArrayAdapter.getView(ArrayAdapter.java)
            at android.widget.AbsListView.obtainView(AbsListView.java)
            at android.widget.ListView.measureHeightOfChildren(ListView.java)
            at android.widget.ListView.onMeasure(ListView.java)
            at android.view.View.measure(View.java)
            at android.widget.RelativeLayout.measureChild(RelativeLayout.java)
            at android.widget.RelativeLayout.onMeasure(RelativeLayout.java)
            at android.view.View.measure(View.java)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java)
            at android.view.View.measure(View.java)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java)
            at android.view.View.measure(View.java)
            at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:868)
            at android.view.View.measure(View.java)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java)
            at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124)
            at android.view.View.measure(View.java)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java)
            at android.view.View.measure(View.java)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java)
            at android.view.View.measure(View.java)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java)
            at android.view.View.measure(View.java)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java)
            at android.view.View.measure(View.java)
            at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java)
            at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java)
            at android.view.Choreographer.doCallbacks(Choreographer.java)
            at android.view.Choreographer.doFrame(Choreographer.java)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java)
            at android.os.Handler.handleCallback(Handler.java)
            at android.os.Handler.dispatchMessage(Handler.java)
            at android.os.Looper.loop(Looper.java)
            at android.app.ActivityThread.main(ActivityThread.java)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
07-08 00:58:34.245     780-3917/? E/ActivityManager﹕ App crashed! Process: nitz.nitrek.myrtoguide

      

+3


source to share


2 answers


You declared an array of websites of size 10, but you only filled it with 2-3 entries depending on the number of websites you received as a response, so passing the entire array to an array, you got a null pointer exception. This is how you got the number of websites received in response and dynamically declared an array of that size.



+1


source


You forgot to override getView on ArrayAdapter. And sync about viewHolder for better performance. You can read this https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView

You need to override this method to bloat your view, otherwise any view will create your adapter and throw a null Exception.

Override example:



 @Override
public View getView(int position, View convertView, ViewGroup parent) {
   // Get the data item for this position
   Object data = yourTabObj[position] 
   // Check if an existing view is being reused, otherwise inflate the view
   if (convertView == null) {
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_listView, parent, false);
   }
   // Lookup view for data population
   TextView title = (TextView) convertView.findViewById(R.id.title);
   title.setText(data.name);
   // Return the completed view to render on screen
   return convertView;

      

}

Once you get it, think about a viewHolder for better performance.

0


source







All Articles