Async and ListView Android



BackgorundTask.java(由于AsyncTask是一个单独的类,如何将OnPostExecute()的结果获取到主活动?)

public class BackgroundTask extends AsyncTask<String,Void,String> {
    public interface AsyncResponse {
        void processFinish(String output);
    }
    public AsyncResponse delegate = null;
    public BackgorundTask(AsyncResponse delegate){
        this.delegate = delegate;
    }
    protected String doInBackground(String... uri) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response;
        String responseString = null;
        try {
            response = httpclient.execute(new HttpGet(uri[0]));
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                responseString = out.toString();
                out.close();
            } else{
                //Closes the connection.
                response.getEntity().getContent().close();
                throw new IOException(statusLine.getReasonPhrase());
            }
        } catch (ClientProtocolException e) {
            //TODO Handle problems..
        } catch (IOException e) {
            //TODO Handle problems..
        }
        return responseString;
    }
    protected void onProgressUpdate(Integer... progress) {
    }
    @Override
    protected void onPostExecute(String result) {
        delegate.processFinish(result);
    }
}

ListActivity.java

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list);
 BackgorundTask asyncTask = (BackgorundTask) new BackgorundTask(new BackgorundTask.AsyncResponse(){
        @Override
        public void processFinish(String output){
            listAdapter.add(output);
        }
    }).execute("some url");
    adapter = new MyCustomAdapter(listAdapter, this);
    final ListView mainListView = (ListView)findViewById(R.id.listView);
    mainListView.setAdapter(adapter);

变量返回正确。但是我不能添加到每个项目的ListView(listAdapter)中。原因可能是什么?我想我必须以某种方式将字符串变量输出从asyncTask拉到我的函数onCreate中。

您的代码很好。你只需要在添加数据后拨打这条线路

listAdapter.add(output); // after this line add below line
listAdapter.notifyDataSetChanged(); 

将数据返回到活动和listadapter的代码对我来说似乎还可以。我认为你只需要在listAdapter.add(output);之后添加一个listAdapter.notifyDataSetChanged();,这样listview就知道它必须重新呈现自己。

当您收到如下输出字符串时,您必须再次设置适配器:

BackgorundTask asyncTask = (BackgorundTask) new BackgorundTask(new BackgorundTask.AsyncResponse(){
        @Override
        public void processFinish(String output){
            listAdapter.add(output);
            adapter = new MyCustomAdapter(listAdapter, this);
            final ListView mainListView = (ListView)findViewById(R.id.listView);
    mainListView.setAdapter(adapter);
        }
    }).execute("some url");

最新更新