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

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

(0)

相关推荐

  • Android 自定义可拖拽View界面渲染刷新后不会自动回到起始位置

    以自定义ImageView为例: /** * 可拖拽ImageView * Created by admin on 2017/2/21. */ public class FloatingImageView extends ImageView{ public FloatingImageView(Context context) { super(context); } public FloatingImageView(Context context, AttributeSet attrs) { su

  • Android 模仿iPhone列表数据View刷新动画详解

    因为我本人很喜欢在不同的页面之间跳转时加点好玩的动画,今天无意间看到一个动画效果感觉不错,几种效果图如下:既然好玩就写在博客中,直接说就是:该效果类似于iPhone中View的切换动画效果,今天就只介绍上面展示的效果. 废话不多说,先上效果,再看代码!! 效果一: 效果二: 效果三: 效果四:(犯错的效果): 效果五(回旋效果一): 效果六(回旋效果二): 效果看完了,就来看下上面效果实现的具体代码吧, 中间会把我自己试验的.犯的错误都以注释的形式写下来的, 大家使用的时候别出错就行了!先来看下

  • Android控制界面刷新技巧汇总

    今天整理一下在项目中怎么去控制我们的数据刷新. 不需要广播.事件总线,就能全局性的控制想要刷新的界面. 先来看一下效果图: 近期在写项目的过程中,感觉很多界面中的状态,如果在详情页或者其他地方改变之后,需要进行同步的话,控制起来还是比较麻烦的. 就比如一个列表界面,我在详情页进行操作之后,回来之后列表状态需要改变,如果我没操作,回来之后是不需要改变,一般写法要么是考虑 startActivityForResult(), 要么就是每次界面重现(onResume方法)的时候,去操作当前列表,star

  • Android 实现界面刷新的几种方法

    Android 界面刷新 Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用. Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面. 利用Handler刷新界面 实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界

  • Android中刷新界面的二种方法

    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用. Android界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面. 利用Handler刷新界面 实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新:而在线程中通过sendMessag

  • Android界面刷新的方法分享

    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用. Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面. 利用Handler刷新界面实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新:而在线程中通过sen

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

    本文实例讲述了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;

  • Android中Listview下拉刷新和上拉加载更多的多种实现方案

    listview经常结合下来刷新和上拉加载更多使用,本文总结了三种常用到的方案分别作出说明. 方案一:添加头布局和脚布局 android系统为listview提供了addfootview和addheadview两个API.这样可以直接自定义一个View,以添加视图的形式实现下来刷新和上拉加载. 实现步骤    1.创建一个类继承ListView:class PullToRefreshListView extends ListView: 2.在构造方法中添加HeadView:addHeaderVi

  • Android中ListView下拉刷新的实现方法实例分析

    本文实例讲述了Android中ListView下拉刷新的实现方法.分享给大家供大家参考,具体如下: ListView中的下拉刷新是非常常见的,也是经常使用的,看到有很多同学想要,那我就整理一下,供大家参考.那我就不解释,直接上代码了. 这里需要自己重写一下ListView,重写代码如下: package net.loonggg.listview; import java.util.Date; import android.content.Context; import android.util.

  • Android中ListView下拉刷新的实现代码

    Android中ListView下拉刷新 实现效果图: ListView中的下拉刷新是非常常见的,也是经常使用的,看到有很多同学想要,那我就整理一下,供大家参考.那我就不解释,直接上代码了. 这里需要自己重写一下ListView,重写代码如下: package net.loonggg.listview; import java.util.Date; import android.content.Context; import android.util.AttributeSet; import a

  • Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

    Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如ListView上有100个Item,一屏只显示10个Item,我们知道getView()中convertView是用来复用View对象的,因为一个Item的对应一个View对象,而Ima

  • Android中Listview点赞功能的实现

    最近这段时间一直在看Android,利用Listview去实现点赞功能,下面给大家介绍下基本思路. 基本思路: 进入界面–>获取数据–> 在Listview中显示–> 通过map集合(position,boolean)保存每一行是否被点击–> 利用实体类去保存相应的对象–> get/set方法进行相应值得改变–> 点击一次,相应的数量加1 只实现了点赞功能,踩和赞基本类似. 具体实现如下: 继承自BaseAdapter package com.gz.test_listv

  • Android 中RecyclerView顶部刷新实现详解

    Android 中RecyclerView顶部刷新实现详解 1. RecyclerView顶部刷新的原理 RecyclerView顶部刷新的实现通常都是在RecyclerView外部再包裹一层布局.在这个外层布局中,还包含一个自定义的View,作为顶部刷新时的指示View.也就是说,外层布局中包含两个child,一个顶部刷新View,一个RecyclerView,顶部刷新View默认是隐藏不可见的.在外层布局中对滑动事件进行处理,当RecyclerView滑动到顶部并继续下滑的时候,根据滑动的距

  • Android中ListView绑定CheckBox实现全选增加和删除功能(DEMO)

    ListView控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小Demo来讲讲,主要是自定义adapter的用法,加了很多的判断等等等等-.我们先来看看实现的效果吧! 好的,我们新建一个项目LvCheckBox 我们事先先把这两个布局写好吧,一个是主布局,还有一个listview的item.xml,相信不用多说 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/

  • Android中ListView + CheckBox实现单选、多选效果

    还是先来看看是不是你想要的效果: 不废话,直接上代码,很简单,代码里都有注释 1 单选 public class SingleActivity extends AppCompatActivity { private ListView listView; private ArrayList<String> groups; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInsta

  • Android中ListView Item布局优化技巧

    本文实例讲述了Android中ListView Item布局优化技巧.分享给大家供大家参考,具体如下: 之前一直都不知道ListView有多种布局的优化方法,只能通过隐藏来实现,自己也知道效率肯定是很低的,但是也不知道有什么方法,这些天又查了一些资料,然后知道 其实google早就帮我们想好了优化方案了. 假设你的ListView Item有三种布局样式的可能:就比如很简单的显示一行字,要靠左,居中,靠右. 这时我们就可以在BaseAdapter里面重写两个方法: private static

随机推荐