簡體   English   中英

Android從arraylist錯誤填充listview

[英]Android populate listview from arraylist Error

我正在嘗試從動態添加了字符串的listview中填充我的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)

有人看到我嘗試填充列表的任何錯誤嗎? 我按照教程進行操作,但是我不知道為什么它不起作用。

閱讀日志,您將看到答案:

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中更新了視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM