iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >android中ListView数据刷新时的同步方法
  • 689
分享到

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

方法listviewAndroid 2022-06-06 10:06:35 689人浏览 八月长安
摘要

本文实例讲述了Android中ListView数据刷新时的同步方法。分享给大家供大家参考。具体实现方法如下: public class Main extends BaseAc

本文实例讲述了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; 
    } 
   }; 
  };  
 } 
  
 private void sendMessageToUpdateUI() { 
  Message msg = new Message(); 
  msg.what = STATUS_CHANGE; 
  mHandler.sendMessage(msg);
  // 向Handler发送消息,更新UI 
 } 
 private void updateUI() { 
  // 详细的更新 
  mExpandableAdapter.notifyDataSetChanged();
  // 更新ExpandableListView 
 } 
  
 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; 
   } 
  }; 
 };  
} 
 
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 
} 
 
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程序设计有所帮助。

您可能感兴趣的文章:Android异步方法以同步方式实现Android多线程之同步的使用Android seekbar(自定义)控制音量同步更新android-获取网络时间、获取特定时区时间、时间同步的方法Android实现歌曲播放时歌词同步显示具体思路Android获取点击屏幕的位置坐标Android 5.0+ 屏幕录制实现的示例代码Android自适应不同屏幕大小的全部方法Android6.0开发中屏幕旋转原理与流程分析Android手机屏幕同步工具asm.jar


--结束END--

本文标题: android中ListView数据刷新时的同步方法

本文链接: https://www.lsjlt.com/news/26726.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作