Android 从异步任务更新ListView

Android 从异步任务更新ListView,android,android-listview,android-asynctask,Android,Android Listview,Android Asynctask,我有两个类,HomeActivity和CustomListAdapter。HomeActivity类扩展了一个活动,然后更新了一个listview。我正在使用一个扩展BaseAAspter的CustomListAdapter类将数据填充到listview。一切正常,但我想在后台任务中加载数据。当我这样做时,出现了一个错误。 下面是我对AyncTask类的onPostExecute的实现 @Override protected void onPostExecute(HomeActivity

我有两个类,HomeActivity和CustomListAdapter。HomeActivity类扩展了一个活动,然后更新了一个listview。我正在使用一个扩展BaseAAspter的CustomListAdapter类将数据填充到listview。一切正常,但我想在后台任务中加载数据。当我这样做时,出现了一个错误。 下面是我对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上的构造函数。但是当我更改它时,一切都会变得很糟糕。 我也尝试过,但没有成功

final ListView lv1 = (ListView) findViewById(R.id.listings);
        lv1.setAdapter(new CustomListAdapter(this, shares)); 
共享是来自web服务的数据数组列表。 下面是CustomListAdapter类中的构造函数

 public CustomListAdapter(Context context, ArrayList listData) {
    this.listData = listData;
    layoutInflater = LayoutInflater.from(context);
}

如何操作?非常感谢您的帮助。

如果要将AsyncTask上下文发送到适配器,则应将承载Listview的活动上下文放入AsyncTask类,然后使用该上下文构造适配器

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

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

如果要将AsyncTask上下文发送到适配器,则应将承载Listview的活动上下文放在AsyncTask类中,然后使用该上下文构造适配器

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

public class SyncHandler extends AsyncTask<String, Void, ResponseType>{
private Activity activity;
public SyncHandler (Activity activity)
{
    this.activity = activity;
}
你必须改变:

 @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));
        }
    });

}
你必须改变:

 @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));
        }
    });

}

请看下面的代码对我有用

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

        progressDilaog.dismiss();

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

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

请参阅下面的代码

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

        progressDilaog.dismiss();

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

还有一件事,您不需要在onPostExecute方法中使用
runOnUiThread
。您可以直接更改listview。

据我所知,您不需要在RunnuiTreas的runnable中运行UI代码,因为它已经在onPostExecute中(onPostExecute在UI线程上运行)。据我所知,您不需要在RunnuiTreas的runnable中运行UI代码,因为它已经在onPostExecute中(onPostExecute在UI线程上运行)@mungaihkamau什么是
onPostExecute(HomeActivity参数)
需要更多信息。什么是HomeActivity?HomeActivity是显示listbview的主要类。Params只是参数的占位符。@mungaihkamau和您的asynctask位于不同的文件中?谢谢Arash,Shani在下面建议了一种更简单的解决方法。我仍然非常感谢您的帮助。@mungaihkamau什么是
onPostExecute(家庭活动参数)
需要更多信息。什么是HomeActivity?HomeActivity是显示listbview的主类。Params只是参数的占位符。@mungaihkamau和您的asynctask位于不同的文件中?感谢Arash,Shani在下面建议了一种更简单的解决方法。我非常感谢您的帮助。onPostExecute在UI线程上运行因此,您不需要以这种方式运行RunNuithRead()。onPostExecute在UI线程上运行,因此您不需要以这种方式运行RunNuithRead()。