我试图将一个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个人。

10-07 19:35
查看更多