Android从arraylist Error填充listview

时间:2015-07-19 22:09:39

标签: java android listview android-asynctask

我正在尝试从我动态添加字符串的列表中填充我的Android应用程序(android studio)中的listview

首先,列表被声明为活动的属性:

private List<String> your_array_list = new ArrayList<String>();  

然后,我有调用方法populatelist()的类。在其中调用了其他方法,但它们都工作正常,populatelist()是唯一一个给我错误的方法:

  private class SendMessage extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            try {               

                    parse(message);
                    populatelist();
                }



            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

    }

这就是方法本身:

public void populatelist() {
    //    String[] myitems = {"World Weather Online","Open Weather Map","Weather"};
        Log.d("Matcher", "Populate! Test 1");
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.items,R.id.textting,your_array_list);
        Log.d("Matcher", "Populate! Test 2");
        ListView list;
        Log.d("Matcher", "Populate! Test 3");
        list = (ListView) findViewById(R.id.services);
        Log.d("Matcher", "Populate! Test 4");
        list.setAdapter(adapter);
        Log.d("Matcher", "Populate! Test 5");

    }

除最后一个“测试5”外,所有日志都打印。当我运行我的应用程序时,我收到以下错误:

07-19 21:13:32.399    1575-1591/com.example.othmane.servicefinder E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #2
    Process: com.example.othmane.servicefinder, PID: 1575
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
            at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6247)
            at android.view.ViewRootImpl.focusableViewAvailable(ViewRootImpl.java:2855)
            at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:679)
            at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:679)
            at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:679)
            at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:679)
            at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:679)
            at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:679)
            at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:679)
            at android.view.View.setFlags(View.java:9603)
            at android.view.View.setFocusableInTouchMode(View.java:6741)
            at android.widget.AdapterView.checkFocus(AdapterView.java:722)
            at android.widget.ListView.setAdapter(ListView.java:488)
            at com.example.othmane.servicefinder.MainActivity.populatelist(MainActivity.java:277)
            at com.example.othmane.servicefinder.MainActivity$SendMessage.doInBackground(MainActivity.java:100)
            at com.example.othmane.servicefinder.MainActivity$SendMessage.doInBackground(MainActivity.java:67)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)

有没有人看到我如何填充列表的错误?我按照教程去做,但我不知道它为什么不起作用。

1 个答案:

答案 0 :(得分:0)

阅读logcat,你会看到答案:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. at 

错误是由您尝试在后台线程中填充视图引起的。为了在主线程中执行工作,您需要调用onPostExecute方法。

以下是我的应用之一的示例:

    public class FetchArtistData extends AsyncTask<String,Void, List<Artist>> {
    private static final String TAG="FetchArtistData";
    @Override
    protected List<Artist> doInBackground(String... params) {
        SpotifyApi api=new SpotifyApi();
        SpotifyService spotify=api.getService();
        ArtistsPager results=spotify.searchArtists(params[0]);
        List<Artist> list=results.artists.items;
        Log.d(TAG, list.toString());
        return list;
    }

    @Override
    protected void onPostExecute(List<Artist> artists) {
        mArtistList=(ArrayList<Artist>)artists;
        Log.d(TAG,Integer.toString(mArtistList.size()));
        updateAdapter(mArtistList);
    }
}

注意到我更新了onPostExecute中的视图。