跳转到主内容
极星编程网:以代码为星,赴技术山海!

android中ListView数据刷新时的同步方法

本文实例讲述了android中ListView数据刷新时的同步方法。分享给大家供大家参考。具体实现方法如下:public class Main extends BaseActivity {private static final String TAG = "tag";private static final int STATUS_CHANGE = 0;ExpandableListView mElv;ArrayList mGroupArray;@Override public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mElv = (ExpandableListView) findViewById(R.id.contact_list);mStatus = (TextView) findViewById(R.id.setStatus);mGroupArray = getIntent().getParcelableArrayListExtra("groupArray");// => 取数据mExpandableAdapter = new ExpandableAdapter(this, Main.this);mElv.setAdapter(mExpandableAdapter);// 异步对比服务器分组和本地分组HandlerThread handlerThread = new HandlerThread("handler_thread");handlerThread.start();UpdateGroupHandler myHandler = new UpdateGroupHandler(handlerThread.getLooper());Message message = myHandler.obtainMessage();message.sendToTarget();mHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case STATUS_CHANGE:// 处理UI更新等操作updateUI();break;}};};}/*** 发送消息更新UI*/ private void sendMessageToUpdateUI() {Message msg = new Message();msg.what = STATUS_CHANGE;mHandler.sendMessage(msg);// 向Handler发送消息,更新UI}private void updateUI() {// 详细的更新mExpandableAdapter.notifyDataSetChanged();// 更新ExpandableListView}/*** 异步刷新分组的handler** @author administrator**/ class UpdateGroupHandler extends Handler {public UpdateGroupHandler() {}public UpdateGroupHandler(Looper looper) {super(looper);}@Override public void handleMessage(Message msg) {ContactsManagerDbAdapter dbAdapter = new ContactsManagerDbAdapter(Main.this);dbAdapter.open();// =>doSomeThing...

mGroupArray = groupList;System.out.println("========数据更新后,刷新listview=========");sendMessageToUpdateUI();}}private class ExpandableAdapter extends BaseExpandableListAdapter {Activity activity;LayoutInflater layoutInflater;public ExpandableAdapter(Activity a, Context context) {activity = a;layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}public Object getChild(int groupPosition, int childPosition) {return mGroupArray.get(groupPosition).getChildList().get(childPosition);}public long getChildId(int groupPosition, int childPosition) {return childPosition;}public int getChildrenCount(int groupPosition) {return mGroupArray.get(groupPosition).getChildList().size();}public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {// .....

return vi;}public Object getGroup(int groupPosition) {return mGroupArray.get(groupPosition);}public int getGroupCount() {return mGroupArray.size();}public long getGroupId(int groupPosition) {return groupPosition;}public View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {GroupInfo groupInfo = mGroupArray.get(groupPosition);String string = groupInfo.getName();convertView = (View) layoutInflater.inflate(R.layout.group_layout,null);final TextView textView = (TextView) convertView.findViewById(R.id.groupName);if (textView != null) {textView.setText(string);}return convertView;}public boolean hasStableIds() {return true;}public boolean isChildSelectable(int groupPosition, int childPosition) {return true;}}}

代码只是提取的部分,应该没多大影响.

上面集合mGroupArray存在数据共享,测试多次发现报错有两种:=>1.java.lang.IndexOutOfBoundsException: Invalid location 3, size is 3

=>2.The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.

第一个问题,数据同步问题,我弄了下没解决.

第二个问题,改变适配器Adapter内容时不要在后台线程中,必须在UI线程中处理

我将上面子线程UpdateGroupHandler里的数据更新利用handler提取到了主线程赋值Message.obj = groupList;

额,改好后测试多次,发现这两问题都解决了,发现还是对handler理解的不够.

发下更改的代码段:@Override public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mElv = (ExpandableListView) findViewById(R.id.contact_list);mStatus = (TextView) findViewById(R.id.setStatus);mGroupArray = getIntent().getParcelableArrayListExtra("groupArray");// => 取数据mExpandableAdapter = new ExpandableAdapter(this, Main.this);mElv.setAdapter(mExpandableAdapter);// 异步对比服务器分组和本地分组HandlerThread handlerThread = new HandlerThread("handler_thread");handlerThread.start();UpdateGroupHandler myHandler = new UpdateGroupHandler(handlerThread.getLooper());Message message = myHandler.obtainMessage();message.sendToTarget();mHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case STATUS_CHANGE:// 处理UI更新等操作updateUI(msg.obj);break;}};};}/*** 发送消息更新UI*/ private void sendMessageToUpdateUI(ArrayList groupList) {Message msg = new Message();msg.what = STATUS_CHANGE;msg.obj = groupList;mHandler.sendMessage(msg);// 向Handler发送消息,更新UI}@SuppressWarnings("unchecked") private void updateUI(Object obj) {// 详细的更新mGroupArray = (ArrayList) obj;mExpandableAdapter.notifyDataSetChanged();// 更新ExpandableListView}/*** 异步刷新分组的handler** @author administrator**/ class UpdateGroupHandler extends Handler {public UpdateGroupHandler() {}public UpdateGroupHandler(Looper looper) {super(looper);}@Override public void handleMessage(Message msg) {ContactsManagerDbAdapter dbAdapter = new ContactsManagerDbAdapter(Main.this);dbAdapter.open();// =>doSomeThing...

System.out.println("========数据更新后,刷新listview=========");sendMessageToUpdateUI(groupList);}}希望本文所述对大家的Android程序设计有所帮助。

您可能感兴趣的文章:Android异步方法以同步方式实现Android多线程之同步锁的使用Android seekbar(自定义)控制音量同步更新android-获取网络时间、获取特定时区时间、时间同步的方法Android实现歌曲播放时歌词同步显示具体思路Android获取点击屏幕的位置坐标Android 5.0+ 屏幕录制实现的示例代码Android自适应不同屏幕大小的全部方法Android6.0开发中屏幕旋转原理与流程分析Android手机屏幕同步工具asm.jar

相关文章