java - 如何从 JSON 添加项目到 ListView ?

标签 java android json listview


我在从 URL 解析 JSON 的代码中遇到问题,应该更新 ListView 。
这是我的代码:

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

问题是此代码仅添加 JSON 数组的最后一个条目,即使 Logcat 正确显示每个条目也是如此。
看来 populatelist 每次都会获得相同的名称值。
这段代码有什么问题?我是 Android 和 Java 开发的新手。

最佳答案

看来您多次调用 populatelist(sometext) ,最后,listview 显示最后一个值。因此将您的代码重写为

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

在此初始化 myStringArray1 作为全局变量,并在 onPostExecute 方法中调用 populatelist 方法,而不是在后台调用它(删除了 runOnUiThread )。

关于java - 如何从 JSON 添加项目到 ListView ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28396965/

相关文章:

javascript - 如何仅检测 native Android 浏览器

json - Redis/Rejson 嵌套文档层次结构性能

javascript - 如何在 extjs 网格单元中显示嵌套数组

java - LibGDX如何判断当前应用运行在哪个平台?

java - windowClosed 触发不止一次。这是错误还是功能?

java - 如何在雪花外部浏览器身份验证中自动插入用户名

java - 以编程方式分配时 CardView.setRadius() 不起作用

java - onClick 事件监听器不适用于 Activity

php - 在 cordova 中使用 php 和 mysql

java - 打印出 java 练习解释