3

我需要用AsyncTask填充ListView。 此代碼工作,TextView更改爲「開始」,然後「結束」。但是ListView是空白的,沒有顯示。在日誌中我看到「array = 3」。在AsyncTask中的Android - setAdapter()

package a.test3; 

import java.util.ArrayList; 

import a.test3.MainActivity; 
import a.test3.R; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    GrabURL mt; 
    TextView textView; 
    ListView lvMain; 
    ArrayList<String> result_arr = new ArrayList<String>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     textView = new TextView(this); 
     lvMain = (ListView) findViewById(R.id.listView1); 

     mt = new GrabURL(); 
     mt.execute(); 
    } 

    public class GrabURL extends AsyncTask<Void, Void, ArrayList<String>> {    
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      textView.setText("Begin"); 
      setContentView(textView); 
     } 

     @Override 
     protected ArrayList<String> doInBackground(Void... params) { 
      result_arr.add("a"); 
      result_arr.add("b"); 
      result_arr.add("c"); 
      return result_arr; 
     } 

     @Override 
     protected void onPostExecute(ArrayList<String> result) { 
      super.onPostExecute(result); 

      Log.d("info", "array = " + result.size()); 

      textView.setText("End"); 
      setContentView(textView); 

      ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, 
        android.R.layout.simple_list_item_1, result); 
      lvMain.setAdapter(adapter); 
     } 
    } 
} 

請告訴我,我做錯了什麼?

回答

3

看看你的代碼

 textView.setText("End"); 
     setContentView(textView); 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, 
       android.R.layout.simple_list_item_1, result_arr); 
     lvMain.setAdapter(adapter); 

你爲你的活動設置視圖(佈局)。您只在這裏顯示TextView setContentView(textView);。當您將TextView設置爲活動的ContentView時,ContentView中沒有ListView lvMain;

刪除此行

setContentView(textView); 

如果仍不能正常工作添加

textView.invalidate(); 
+0

謝謝!這是一個非常詳細和全面的迴應。 –

0

你缺少Adapter.notifyDataSetChanged()的調用。您的代碼應該看起來像

@Override 
protected void onPostExecute(ArrayList<String> result) { 
    ... 
    lvMain.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
} 
+1

你不需要通知。 Notify用於告訴觀察者,適配器內部的數據集設置不正確,而不是當您將新適配器設置爲ListView時。 – Agata