本文实例讲述了android中ListView数据刷新时的同步方法。分享给大家供大家参考。具体实现方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
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提取到了主线程赋值
1
|
Message.obj = groupList; |
额,改好后测试多次,发现这两问题都解决了,发现还是对handler理解的不够.
发下更改的代码段:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
@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); } } |
希望本文所述对大家的Android程序设计有所帮助。