Francis
Francis

Reputation: 77

How to Add item to listview from JSON?


I'm having trouble with a code that parse JSON from URL and should update a listview.
This is my code:

private String sometext;

public class AsyncTaskParseJson extends AsyncTask<String, String, String> {

        final String TAG = "AsyncTaskParseJson.java";

        // contacts JSONArray
        JSONArray dataJsonArr = null;

        @Override
        protected void onPreExecute() {}

        @Override
        protected String doInBackground(String... arg0) {

            try {

                // instantiate our json parser
                JSONParser jParser = new JSONParser();

                SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
                String userEmailVariable = settings.getString("variable1", "");

                // get json string from url
                JSONObject json = jParser.getJSONFromUrl("path/to/jsonpage.php", userEmailVariable.toString());

                // get the array of users
                dataJsonArr = json.getJSONArray("Files");

                // loop through all users
                for (int i = 0; i < dataJsonArr.length(); i++) {

                    JSONObject c = dataJsonArr.getJSONObject(i);
                    sometext = "";
                    // Storing each json item in variable
                    String id = c.getString("id");
                    String type = c.getString("type");
                    String name = c.getString("name");
                    String icon = c.getString("icon");
                    sometext = name.toString();

                    if(icon.toString().length() == 0){
                        icon = "default";
                    }

                    // show the values in our logcat
                    Log.i(TAG, "type: " + type
                            + ", name: " + name
                            + ", icon: " + icon);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            populatelist(sometext);
                        }
                    });
                }

            } catch (JSONException e) {
                Log.i(TAG, "Errore LS: Errore del JSON in Files");
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String strFromDoInBg) {}
    }
    public void populatelist(String name) {
        final String TAG = "Popolazione lista";
        ListView myListView = (ListView)findViewById(R.id.userContentList);
        ArrayList<String> myStringArray1 = new ArrayList<String>();
        myStringArray1.add(name);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.list_item, R.id.file_list, myStringArray1);
        myListView.setAdapter(adapter);
        Log.i(TAG, name);
    }

The problem is that this code adds only the last entry of the JSON array, even when Logcat is showing correctly every entry.
It seems that populatelist gets every time the same name value.
What's wrong with this code? I'm a newbie at Android and Java developing.

Upvotes: 0

Views: 299

Answers (1)

Giru Bhai
Giru Bhai

Reputation: 14398

It seems that you call populatelist(sometext) multiple times and at last,listview shows last value.So Rewrite your code as

public class AsyncTaskParseJson extends AsyncTask < String, String, String > {

    final String TAG = "AsyncTaskParseJson.java";
    ArrayList < String > myStringArray1 = new ArrayList < String > ();
    // contacts JSONArray
    JSONArray dataJsonArr = null;

    @Override
    protected void onPreExecute() {}

    @Override
    protected String doInBackground(String...arg0) {

        try {

            // instantiate our json parser
            JSONParser jParser = new JSONParser();

            SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
            String userEmailVariable = settings.getString("variable1", "");

            // get json string from url
            JSONObject json = jParser.getJSONFromUrl("path/to/jsonpage.php", userEmailVariable.toString());

            // get the array of users
            dataJsonArr = json.getJSONArray("Files");

            // loop through all users
            for (int i = 0; i < dataJsonArr.length(); i++) {

                JSONObject c = dataJsonArr.getJSONObject(i);
                sometext = "";
                // Storing each json item in variable
                String id = c.getString("id");
                String type = c.getString("type");
                String name = c.getString("name");
                String icon = c.getString("icon");
                sometext = name.toString();

                if (icon.toString().length() == 0) {
                    icon = "default";
                }

                // show the values in our logcat
                Log.i(TAG, "type: " + type + ", name: " + name + ", icon: " + icon);

                myStringArray1.add(sometext);
            }

        } catch (JSONException e) {
            Log.i(TAG, "Errore LS: Errore del JSON in Files");
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(String strFromDoInBg) {
        populatelist(myStringArray1);
    }
}
public void populatelist(ArrayList <String> myStringArray1) {
    final String TAG = "Popolazione lista";
    ListView myListView = (ListView) findViewById(R.id.userContentList);

    ArrayAdapter < String > adapter = new ArrayAdapter < String > (getApplicationContext(), R.layout.list_item, R.id.file_list, myStringArray1);
    myListView.setAdapter(adapter);
    Log.i(TAG, name);
}

In this initialise myStringArray1 as global variable and call populatelist method in onPostExecute method instead of calling it in background (removed runOnUiThread).

Upvotes: 1

Related Questions