我的onCreate方法中有这个:

String[] myStringArray = {"a","b","c","a","b","c","a","b","c","a","b","c","a","b","c","a","b","c"};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_top_jokes);

    new loadJson().execute();

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, myStringArray);

    ListView listView = (ListView) findViewById(R.id.topJokesList);
    listView.setAdapter(adapter);

    listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // When clicked, show a toast with the TextView text
            Toast.makeText(getApplicationContext(),
            ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
        }
    });

}

上面的代码使用myStringArray的内容填充listView,现在一切正常。当我调用new loadJson().execute();时,问题就来了,它执行得很好,这是该方法的代码:
public class loadJson extends AsyncTask<Void, Integer, String>{

@Override
protected String doInBackground(Void... params) {
    URL u;
    StringBuffer buffer = new StringBuffer();
    try {
    u = new URL("https://website.com/content/showContent.php");
    URLConnection conn = u.openConnection();
    BufferedReader in = new BufferedReader(
                            new InputStreamReader(
                                conn.getInputStream()));

    String inputLine;
    while ((inputLine = in.readLine()) != null)
        buffer.append(inputLine);
    in.close();

    }catch(Exception e){
        e.printStackTrace();
    }
    return buffer.toString();
}

protected void onPostExecute(String buffer) {
    JSONArray jsonArray = new JSONArray();
    try {
        jsonArray = new JSONArray(buffer);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println("JSONarray: " + jsonArray);
    String[] newArray = null;
    for (int i = 0; i < jsonArray.length(); i++) {
        try {

        newArray[i] = jsonArray.getJSONObject(i).toString();
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    myStringArray = newArray;
 }

}

如您所见,我将使用myStringArray中获取的新值来更新newArray的硬编码内容。现在,我看不到新内容。我知道它在那里,但是我该如何告诉当前 Activity :“嘿,我更新了您的阵列,请显示它!” ?

我知道我缺少一些很小的东西,但是作为一个初学者,我无法发现它。

最佳答案

我找到了这个问题的答案,因为我自己在寻找答案。
这里有一些很接近的答案,但是它们遗漏了一些片段,这些片段将永远无法帮助您找到答案。

首先,向您的AsyncTask类添加两个成员变量:

private ListView listView;
private Activity activity;

接下来,向您添加一个带有Activity的AsyncTask类的构造函数:
  public loadJson(Activity activity) {
        this.activity = activity;
    }

现在,当您新建AsyncTask类并调用execute()时,将添加对调用它的Activity的引用(在构造AsyncTask类时传递的此值)。
new loadJson(this).execute(param);

最后,回到AsyncTask中,您将为postExecute()编写代码,如下所示:
protected void onPostExecute(String output) {
        listView = (ListView) activity.findViewById(R.id.targetListView);
        ArrayAdapter<String> adapter = (ArrayAdapter<String>)listView.getAdapter();
        adapter.add(output);
        adapter.notifyDataSetChanged();
    }

您必须具有对Activity的引用,才能调用findViewById。
请注意,targetListView是原始 Activity 上的ListView的ID。

我们已经将该 Activity 发送到AsyncTask的构造函数中,以便可以使用。
现在,您可以获取适配器并向其中添加值,然后调用notifyDataSetChanged(),以便它将在您的UI上更新。

我在解决方案中使用了这段代码,效果很好。

07-28 02:31
查看更多