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

时间:2022-11-25 19:01:38

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