一个令人无比蛋疼的线程里更新ListView的有关问题

一个令人无比蛋疼的线程里更新ListView的问题
弄了好几天了,想实现一个功能:显示一个ListView,在Activity的Create方法中开启一个新的线程,在线程里通过循环为一个自定义的ArrayAdapter类的add(使用父类的方法)方法增加数据,ListView已经使用setAdapter方法与自定义的ArrayAdapter绑定,希望在线程里为ArrayAdapter增加数据的同时,显示的ListView能同步显示出增加的数据,可是这么做后,会报Only the original thread that created a view hierarchy can touch its views的错误,并出现Force Close

最终希望达到的效果就是,ListView随着线程里ArrayAdapter数据项的逐步增加(故意增加延迟放慢循环),ListView一条一条的显示数据,并不影响主界面的其他操作。

我想可能是我的思路有问题,希望能熟悉Android开发的朋友们能帮帮我,谢谢了。

另外这个代码的ListView只能显示出ArrayAdapter的前10条数据的重复组合,虽然数据的总数貌似是对的,但是ListView的显示的是ArrayAdapter的前10条数据的重复随机组合,为什么会出现这种情况呢?

再次感谢各位了!谢谢!

贴出全部代码:

主Activity代码:

ListTest.java:

Java code


public class ListTest extends Activity {
    
    private ListView lv;
    
       /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        lv = (ListView)findViewById(R.id.list);
      
        
        //创建新线程用来显示列表
        HandlerThread handlerThread = new HandlerThread("hthread_readcontact");
        handlerThread.start(); //异步启动线程
        //创建Handler
        MyHandler myHandler = new MyHandler(handlerThread.getLooper());
        //创建消息对象
        Message msg = myHandler.obtainMessage();
        
        //取出消息并执行
        msg.sendToTarget();
        
    }
    
    //循环增加100个列表项
    protected void AddListItem(){
        List<PeopleInfo> myList = new ArrayList<PeopleInfo>();
        MyAdapter ca = new MyAdapter(ListTest.this,myList);
        //ca.setNotifyOnChange(true);
        lv.setAdapter(ca);
        
        for(int i=1;i<=100;i++){
            
            //增加记录
            PeopleInfo pe = new PeopleInfo();
            pe.setPeoleName("Fucker"+Integer.toString(i));
            pe.setPeopleNum(Integer.toString(i));
            System.out.println("i:"+Integer.toString(i));
            System.out.println("PeopleInfo-->Name:"+pe.peopleName);
            System.out.println("PeopleInfo-->Num :"+pe.peopleNum);
            ca.add(pe);
            
            SystemClock.sleep(50L); //为了看到效果,故意增加一个延迟
        }
        ca.notifyDataSetChanged();
    }
    
    class MyHandler extends Handler{
            
            public MyHandler(){
                
            }
            
            public MyHandler(Looper looper){
                super(looper);
            }
    
            @Override
            public void handleMessage(Message msg) {

                AddListItem();
                System.out.println("Thread is runed!");
            }
    }
    
 
}




其他类代码:

MyAdapter.java:

Java code


public class MyAdapter extends ArrayAdapter<PeopleInfo> {

    private LayoutInflater inflater;
    List<PeopleInfo> itemList;
    private static final int mResource = R.layout.contact_list; //xml布局文件

    public MyAdapter(Context context,List<PeopleInfo> objects) {
        super(context, mResource, objects);
        // TODO Auto-generated constructor stub
        inflater = LayoutInflater.from(context);
        itemList = objects;
    }
    
    @Override
    public void add(PeopleInfo object) {
        // TODO Auto-generated method stub
        super.add(object);
        //itemList.add(object);
    }

    @Override
    public void setNotifyOnChange(boolean notifyOnChange) {
        // TODO Auto-generated method stub
        super.setNotifyOnChange(notifyOnChange);
    }

    @Override
    public Filter getFilter() {
        // TODO Auto-generated method stub
        return super.getFilter();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder holder;
        holder = new ViewHolder();
        
        if(convertView == null){
        
            convertView = inflater.inflate(R.layout.contact_list, null);
            //convertView = inflater.inflate(R.layout.listitem, null);
            
            holder.PhoneName = (TextView)convertView.findViewById(R.id.mname);
            holder.PhoneNum = (TextView)convertView.findViewById(R.id.msisdn);
            
            convertView.setTag(holder);
            holder.PhoneName.setText(itemList.get(position).getPeopleName());
            holder.PhoneNum.setText(itemList.get(position).getPeopleNum());
            
        }
        
        return convertView;
    }
    
    class ViewHolder{
        TextView PhoneName;
        TextView PhoneNum;
    }
}