弄了好几天了,想实现一个功能:显示一个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; }}