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