Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android中ListView數據刷新時的同步方法

android中ListView數據刷新時的同步方法

編輯:關於Android編程

本文實例講述了android中ListView數據刷新時的同步方法。分享給大家供大家參考。具體實現方法如下:

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); 
 } 
}

希望本文所述對大家的Android程序設計有所幫助。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved