gpt4 book ai didi

java - 无法在 onPostExecute 中更新 android listview

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:58:39 25 4
gpt4 key购买 nike

我的 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;
}

}

如您所见,我正在使用提取到 newArray 中的新值更新 myStringArray 的硬编码内容。现在我无法看到新内容。我知道它在那里,但我怎么能告诉当前 Activity :“嘿,我更新了你的数组,请展示它!” ?

我知道我遗漏了一些非常小的东西,但作为初学者,我无法发现它。

最佳答案

我找到了这个问题的答案,因为我自己也在寻找答案。这里有一些接近的答案,但它们遗漏了一些永远无法让您找到答案的部分。

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

private ListView listView;
private Activity activity;

接下来,向您的 AsyncTask 类添加一个构造函数,它接受一个 Activity:

  public loadJson(Activity activity) {
this.activity = activity;
}

现在,当您新建 AsyncTask 类并调用 execute() 时,您将添加对调用它的 Activity 的引用(构造 AsyncTask 类时传入的 this 值)。

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 上更新。

我在我的解决方案中使用了这段代码,它运行良好。

关于java - 无法在 onPostExecute 中更新 android listview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21658814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com