从AsyncTask更新ListView

时间:2013-07-02 10:03:05

标签: android android-listview android-asynctask

我有两个类,HomeActivity和CustomListAdapter.THe HomeActivity类扩展了一个活动,然后更新了listview。我使用扩展BaseAsapter的CustomListAdapter类将数据填充到listview.Everything工作正常但我想加载后台任务中的数据。当我这样做时,会出现错误。 这是我对AyncTask类的onPostExecute的实现。

@Override
    protected void onPostExecute(HomeActivity Params){
        progressDialog.dismiss();
        runOnUiThread(new Runnable(){
            public void run(){
                final ListView lv1 = (ListView) findViewById(R.id.listings);
                lv1.setAdapter(new CustomListAdapter(this, shares));
            }
        });

    }

我收到一个错误,告诉我应该更改CustomListAdapter.But上的构造函数,当我更改它时,一切都变得艰难。 我也试过这个也不成功

final ListView lv1 = (ListView) findViewById(R.id.listings);
        lv1.setAdapter(new CustomListAdapter(this, shares)); 

shares是来自Web服务的数据的arraylist。 这是CustomListAdapter类

中的构造函数
 public CustomListAdapter(Context context, ArrayList listData) {
    this.listData = listData;
    layoutInflater = LayoutInflater.from(context);
}

怎么办呢?帮助将受到高度赞赏。

3 个答案:

答案 0 :(得分:4)

你必须改变:

 @Override
 protected void onPostExecute(HomeActivity Params){
    progressDialog.dismiss();
    runOnUiThread(new Runnable(){
        public void run(){
            final ListView lv1 = (ListView) findViewById(R.id.listings);
            lv1.setAdapter(new CustomListAdapter(YourActivity.this, shares));
        }
    });

}

答案 1 :(得分:1)

请参阅以下代码对我有用

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        progressDilaog.dismiss();

        itemListAdapter = new ItemListBaseAdapter(
                        IncidentListActivity.this, Util.arrIncidents);
        gridView.setAdapter(itemListAdapter);
     }

还有一件事, onPostExecute 方法不需要 runOnUiThread。您可以直接更改列表视图。

答案 2 :(得分:0)

您正在将AsyncTask上下文发送到适配器,您应该将托管Listview的Activity上下文放到AsyncTask类中,然后使用该Context构建适配器。

编辑:以此为例,默认情况下onPostExecute在Ui线程上运行,不需要定义runOnUiThread

public class SyncHandler extends AsyncTask<String, Void, ResponseType>{
private Activity activity;
public SyncHandler (Activity activity)
{
    this.activity = activity;
}

然后在您的调用Activity中将Activity上下文传递给您的Async类:

new SyncHandler(this).execute();