【问题标题】:Android - setAdapter() in AsyncTaskAndroid - AsyncTask 中的 setAdapter()
【发布时间】:2012-10-24 10:35:47
【问题描述】:

我需要用 AsyncTask 填充 ListView。 此代码有效,TextView 更改为“开始”,然后更改为“结束”。但是 ListView 是空白的,没有显示。在日志中我看到“array = 3”。

package a.test3;

import java.util.ArrayList;

import a.test3.MainActivity;
import a.test3.R;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

    GrabURL mt;
    TextView textView;
    ListView lvMain;
    ArrayList<String> result_arr = new ArrayList<String>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = new TextView(this);
        lvMain = (ListView) findViewById(R.id.listView1);

        mt = new GrabURL();
        mt.execute();
    }

    public class GrabURL extends AsyncTask<Void, Void, ArrayList<String>> {             
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            textView.setText("Begin");
            setContentView(textView);
        }

        @Override
        protected ArrayList<String> doInBackground(Void... params) {
            result_arr.add("a");
            result_arr.add("b");
            result_arr.add("c");
            return result_arr;
        }

        @Override
        protected void onPostExecute(ArrayList<String> result) {
            super.onPostExecute(result);

            Log.d("info", "array = " + result.size());

            textView.setText("End");
            setContentView(textView);

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,
                    android.R.layout.simple_list_item_1, result);
            lvMain.setAdapter(adapter);
        }
    }
}

请告诉我,我做错了什么?

【问题讨论】:

    标签: java android android-listview android-asynctask android-adapter


    【解决方案1】:

    看看你的代码

            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 setContentView(textView);。当您将 TextView 设置为 Activity 的 ContentView 时,您的 ContentView 中没有 ListView lvMain;

    删除这一行

    setContentView(textView);
    

    如果还是不行就加

    textView.invalidate();
    

    【讨论】:

    • 谢谢!这是一个非常详细和全面的回应。
    【解决方案2】:

    您缺少对 Adapter.notifyDataSetChanged() 的调用。你的代码应该是这样的

    @Override
    protected void onPostExecute(ArrayList<String> result) {
        ...
        lvMain.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
    

    【讨论】:

    • 您无需通知。 Notify 用于告诉观察者适配器内部的数据集已更改,而不是在您将新适配器设置为 ListView 时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多