本文实例讲述了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程序设计有所帮助。