2015-02-08 142 views
0


我在解析来自URL的JSON的代码时遇到问题,应该更新一个listview。
这是我的代码:
如何将项目从JSON添加到列表视图?

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开发人员的新手。

回答

1

看来你打电话populatelist(sometext)多次,最后,列表视图显示最后value.So重写代码为

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为全局变量和调用populatelist方法onPostExecute方法,而不是调用的它在后台(删除runOnUiThread)。

+0

嗨,谢谢你帮助我。无论如何,在populatelist()在行ArrayAdapter < String > adapter = new ArrayAdapter < String >(getApplicationContext(),R.layout.list_item,R.id.file_list,myStringArray1);它说'无法解析符号myStringArray1'。为什么? 更新:非常感谢!现在它工作了! :D – 2015-02-08 17:41:54

+0

@FrancescoSorge在'populatelist'方法中传递'myStringArray1'作为参数(见编辑) – 2015-02-08 17:45:38

+0

非常感谢!现在它完美的工作! :D – 2015-02-08 17:46:09