Johnathan Au
Johnathan Au

Reputation: 5362

Why does my ListView not update with SimpleAdapter?

I am retrieving JSON data from my server with which I want to update my ListView with. Everything works fine with retrieving the data but after it's finished and it tries to update the list I just get an empty page with no errors. Log.d("ListLocations", "after") is able to run as well so I don't see any problems with PostExecute and intiliasation of SimpleAdapter

I have adapted my code from this tutorial: http://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/#ff0000

This is my ListActivity class:

public class ListLocations extends ListActivity
{
    //Root url and controller
    private static String root = "someURL/";
    private static String locationsController = "locations";

    // Progress Dialog
    private ProgressDialog pDialog;

    //JSON node names for locations 
    private static final String TAG_ID = "id";
    private static final String TAG_NAME = "name";
    private static final String TAG_TERRAIN = "terrain";
    private static final String TAG_DIFFICULTY = "difficulty";
    private static final String TAG_RATINGS = "ratings";
    private static final String TAG_UID = "uid";
    private static final String TAG_LONG= "long";
    private static final String TAG_LAT= "lat";
    private static final String TAG_DISTANCE= "distance";
    private static final String TAG_COMID= "comid";

    //Will be used to contain the list of locations extracted from JSON
    ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();

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

        new GetLocations().execute(root + locationsController);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_list_locations, menu);
        return true;
    }
    class GetLocations extends AsyncTask<String, Void, Void>
    {
        //      private ProgressDialog pDialog;
        protected void onPreExecute()
        {
            super.onPreExecute();
            pDialog = new ProgressDialog(ListLocations.this);
            pDialog.setMessage("Loading locations. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }


        @Override
        public Void doInBackground(String... urls)
        {
            try
            {               
                JSONHandler jsonHandler = new JSONHandler();
                JSONObject json= jsonHandler.getJSONFromUrl(urls[0]);
                Log.d("ListLocations",json.toString());

                JSONArray locations = json.getJSONArray("locations");
                int length = locations.length();

                ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
                for(int i = 0; i < length; i++)
                {
                    JSONObject loc = locations.getJSONObject(i);

                    //Create HashMap    
                    HashMap<String, String> map = new HashMap<String, String>();

                    //Get and store values into map
                    map.put("id", loc.getString(TAG_ID));
                    map.put("name", loc.getString(TAG_NAME));
                    map.put("distance", loc.getString(TAG_DISTANCE));
                    map.put("difficulty", loc.getString(TAG_DIFFICULTY));
                    map.put("terrain", loc.getString(TAG_TERRAIN));
                    map.put("ratings", loc.getString(TAG_RATINGS));
                    map.put("long", loc.getString(TAG_LONG));
                    map.put("lat", loc.getString(TAG_LAT));
                    map.put("uid", loc.getString(TAG_UID));
                    map.put("comid", loc.getString(TAG_COMID));

                    //Add map to list
                    list.add(map);
                }
                System.out.println(list);

            }
            catch (Exception e)
            {
                 e.printStackTrace();            
            }
            Log.d("ListLocations", "Successfully finished HTTP Request");
            return(null);
        }

          /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(Void result) { 
            super.onPostExecute(result);
            pDialog.dismiss();

            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                public void run() {
                    Log.d("ListLocations", "inside run");
                       ListAdapter adapter = new SimpleAdapter(
                               ListLocations.this, list,
                               R.layout.list_item, new String[] { TAG_ID,
                                       TAG_NAME},
                               new int[] { R.id.id, R.id.name });



                       Log.d("ListLocations", "after");
                       // updating listview
                       setListAdapter(adapter);


                }
            });

        }

    }
}

This is list_item.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <!-- location id (pid) - will be HIDDEN - used to pass to other activity -->
    <TextView
        android:id="@+id/id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" />

    <!-- Name Label -->
    <TextView
        android:id="@+id/name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingTop="6dip"
        android:paddingLeft="6dip"
        android:textSize="17dip"
        android:textStyle="bold" />

</LinearLayout>

This is activity_list_locations.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

Upvotes: 0

Views: 735

Answers (1)

user
user

Reputation: 87064

You never put the data in the list field from the Activity that you use with the SimpleAdapter because the list variable in the doInBackground method is a local variable and not the field. Instead of:

//...
ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
for(int i = 0; i < length; i++) {
//...

write:

//...
list = new ArrayList<HashMap<String, String>>();
for(int i = 0; i < length; i++) {
//...

so you don't make a local variable and put the elements in the right list.

Upvotes: 2

Related Questions