public class Main extends BaseActivity {        private static final String TAG = "tag";        private static final int STATUS_CHANGE = 0;        ExpandableListView mElv;                ArrayList<GroupInfo> 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<GroupInfo> 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<GroupInfo>) 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);                }        }


更多相关文章

  1. android 数据库初体验
  2. Android(安卓)之 GrideView网格视图
  3. android 参数 加密,解密 参数提交,数据返回
  4. Android(安卓)Audio代码分析17 - setvolume函数
  5. Linux 国内源、Android(安卓)SDK更新代理/镜像
  6. Android(安卓)Webview 获取网页form 提交的数据
  7. 关于Android工程的构建工具-不定时更新
  8. Android中向SD卡读写数据,读SD卡和手机内存
  9. mybatisplus的坑 insert标签insert into select无参数问题的解决

随机推荐

  1. Android全部源码导入Eclipse
  2. Android开发:高德地图通过经纬度反编译其
  3. Android+Eclipse[Window下Android的应用
  4. Android百分比布局支持库
  5. 【Android】Android蓝牙开发深入解析
  6. android开发—01开发环境的搭建
  7. Android 剪切板监听
  8. ActionBar(1) 告别ActionBarSherlock,使用
  9. Android从SD卡和Res读取图片,防止发生OOM
  10. 安卓中出现Android library projects can