Android - Adding and showing items to ListView one at a time using an ArrayAdapter

后端 未结 1 1285
慢半拍i
慢半拍i 2020-12-14 04:33

I\'m using an ArrayAdapter to add items to a custom ListView and showing the results in my Android app. The problem I\'m having is that the ArrayAdapter seems to wait until

相关标签:
1条回答
  • 2020-12-14 05:03

    Android's UI is single-threaded. You are not giving control back to Android from the main application thread each time you add an entry to the adapter. Hence, Android does not get a chance to display your entries until you return control, and you're not doing that until you have populated your adapter in its entirety.

    Here is an example showing the use of an AsyncTask to fill an ArrayAdapter progressively via a background thread.

    /***
      Copyright (c) 2008-2012 CommonsWare, LLC
      Licensed under the Apache License, Version 2.0 (the "License"); you may not
      use this file except in compliance with the License. You may obtain   a copy
      of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
      by applicable law or agreed to in writing, software distributed under the
      License is distributed on an "AS IS" BASIS,   WITHOUT WARRANTIES OR CONDITIONS
      OF ANY KIND, either express or implied. See the License for the specific
      language governing permissions and limitations under the License.
    
      From _The Busy Coder's Guide to Android Development_
        http://commonsware.com/Android
    */
    
    package com.commonsware.android.async;
    
    import android.app.ListActivity;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.SystemClock;
    import android.widget.ArrayAdapter;
    import android.widget.Toast;
    import java.util.ArrayList;
    
    public class AsyncDemo extends ListActivity {
      private static final String[] items={"lorem", "ipsum", "dolor",
                                          "sit", "amet", "consectetuer",
                                          "adipiscing", "elit", "morbi",
                                          "vel", "ligula", "vitae",
                                          "arcu", "aliquet", "mollis",
                                          "etiam", "vel", "erat",
                                          "placerat", "ante",
                                          "porttitor", "sodales",
                                          "pellentesque", "augue",
                                          "purus"};
      @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        setListAdapter(new ArrayAdapter<String>(this,
                            android.R.layout.simple_list_item_1,
                            new ArrayList<String>()));
    
        new AddStringTask().execute();
      }
    
      class AddStringTask extends AsyncTask<Void, String, Void> {
        @Override
        protected Void doInBackground(Void... unused) {
          for (String item : items) {
            publishProgress(item);
            SystemClock.sleep(200);
          }
    
          return(null);
        }
    
        @SuppressWarnings("unchecked")
        @Override
        protected void onProgressUpdate(String... item) {
          ((ArrayAdapter<String>)getListAdapter()).add(item[0]);
        }
    
        @Override
        protected void onPostExecute(Void unused) {
          Toast
            .makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT)
            .show();
        }
      }
    }
    
    0 讨论(0)
提交回复
热议问题