Java AsyncTask中的Android-setAdapter()
我需要用AsyncTask填充ListView。 此代码起作用,文本视图更改为“开始”,然后更改为“结束”。但ListView为空,不显示。在日志中,我看到“array=3”Java AsyncTask中的Android-setAdapter(),java,android,android-listview,android-asynctask,android-adapter,Java,Android,Android Listview,Android Asynctask,Android Adapter,我需要用AsyncTask填充ListView。 此代码起作用,文本视图更改为“开始”,然后更改为“结束”。但ListView为空,不显示。在日志中,我看到“array=3” 包a.test3; 导入java.util.ArrayList; 导入a.test3.main活动; 导入a.test3.R; 导入android.os.AsyncTask; 导入android.os.Bundle; 导入android.app.Activity; 导入android.util.Log; 导入android
包a.test3;
导入java.util.ArrayList;
导入a.test3.main活动;
导入a.test3.R;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.app.Activity;
导入android.util.Log;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入android.widget.TextView;
公共类MainActivity扩展了活动{
地堑;
文本视图文本视图;
ListView lvMain;
ArrayList结果_arr=新的ArrayList();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=新的textView(此);
lvMain=(ListView)findViewById(R.id.listView1);
mt=新的抓取URL();
mt.execute();
}
公共类GrabURL扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
setText(“开始”);
setContentView(文本视图);
}
@凌驾
受保护的ArrayList doInBackground(无效…参数){
结果加上(“a”);
结果加上(“b”);
结果加上(“c”);
返回结果_arr;
}
@凌驾
受保护的void onPostExecute(ArrayList结果){
super.onPostExecute(结果);
Log.d(“info”,“array=“+result.size());
textView.setText(“结束”);
setContentView(文本视图);
ArrayAdapter=新的ArrayAdapter(MainActivity.this,
android.R.layout.simple_list_item_1,结果);
lvMain.setAdapter(适配器);
}
}
}
请告诉我,我做错了什么?看看你的代码
textView.setText("End");
setContentView(textView);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_list_item_1, result_arr);
lvMain.setAdapter(adapter);
如果仍不起作用,请添加
textView.invalidate();
您缺少对Adapter.notifyDataSetChanged()的调用。您的代码应该如下所示
@Override
protected void onPostExecute(ArrayList<String> result) {
...
lvMain.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@覆盖
受保护的void onPostExecute(ArrayList结果){
...
lvMain.setAdapter(适配器);
adapter.notifyDataSetChanged();
}
您不需要通知。Notify用于告诉观察者适配器内的数据集已关闭,而不是在您将新适配器设置为ListView时。谢谢!这是一个非常详细和全面的回应。
textView.invalidate();
@Override
protected void onPostExecute(ArrayList<String> result) {
...
lvMain.setAdapter(adapter);
adapter.notifyDataSetChanged();
}