我试图将一个ArrayList从AsyncTask类返回到MainAcitivity类,然后使用此arraylist填充MainActivity中的gridview。
parseURL采用String参数,以解析URL。当用户单击按钮时,将执行parseURL。我已经编译并运行了代码,但是在触发按钮事件并且两次按下按钮后,gridview没有被填充,导致应用崩溃。
编辑:添加循环回调后,它停止崩溃,但仍不会填充gridview。我要填充gridview的ArrayList对象的格式为10,John,Smith
这是我的MainActivity代码(使用Stanislav Bodnar建议)
private GridView grid1;
private ArrayAdapter<String> adapter;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//initalized the grid and adapter
grid1 = (GridView)findViewById(R.id.gridView1);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
grid1.setAdapter(adapter);
}
public void onButtonClick(View v) {
EditText textInput = (EditText) findViewById(R.id.editText1);
String code = textInput.getText().toString();
new parseURL() {
@Override
protected void onPostExecute(List<String> list) {
//use the list from parseURL to fill grid view
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
gridView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
}.execute(code);
ParseURL类
public class parseURL extends AsyncTask<String, Void, List<String>> {
protected List<String> doInBackground(String... params) {
List<String> str = new ArrayList<String>();
try {
Document doc = Jsoup.connect("http://www.mywebsite.com/id/" + params).get();
Elements row1 = doc.select("table");
Elements row2 = doc.select("td");
Elements row3 = doc.select("td");
for (int i = 0; i < row1.size(); i++) {
str.add(row1.get(i).text() + "," + row2.get(i).text() + "," + row2.get(i).text());
}
return str;
} catch (Exception e) {
return new ArrayList<String>();
}
}
最佳答案
您可以添加加载回调。
public void onButtonClick(View v) {
EditText textInput = (EditText) findViewById(R.id.editText1);
String code = textInput.getText().toString();
new parseURL() {
@Override
protected void onPostExecute(List<String> list) {
//use the list from parseURL to fill grid view
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
gridView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
}.execute(code);
}
Asynctask:
public class parseURL extends AsyncTask<String, Void, List<String>> {
protected List<String> doInBackground(String... params) {
List<String> str = new ArrayList<String>();
try {
Document doc = Jsoup.connect("http://www.mywebsite.com/id/" + params).get();
Elements row1 = doc.select("table");
Elements row2 = doc.select("td");
Elements row3 = doc.select("td");
for (int i = 0; i < row1.size(); i++) {
str.add(row1.get(i).text() + "," + row2.get(i).text() + "," + row2.get(i).text());
}
return str;
} catch (Exception e) {
return new ArrayList<String>();
}
}
}
补充
如果由onPostExecute返回的数组列表不为空,则将以以下方式填充您的网格,即每个单元格具有字符串10,John,Smith。请检查doInBackground方法没有捕获某些异常并正确填充数组列表。
接下来,如果要执行表视图,其中1行将包含3列10 |约翰| Smith然后将数据解析为对象结构:
class Person {
private int id;
private String firstName;
private String lastName;
}
然后更改方法doInBackground以返回Person对象的数组列表。
在使用Person对象的init视图中创建自定义适配器(扩展BaseAdapter)。
视图将作为具有水平方向的LinearLayout包含3个具有布局权重的TextView(android:layout_weight =“ 0.3”-在每个TextView中设置,您可以更改此值)。然后使用ListView而不是GridView。列表视图的每一行将包含1个人。