前一段时间在做一个项目的时候遇到了一个关于BaseAdapter的notifyDataSetChanged()方法无效问题,当时在网上搜了一个解决方法,今天又遇到了一个类似的问题,我在这里做个记录,防止以后再次发生,或者其他朋友再次遇到。

一、ScrollView中嵌套ListView或GridView

原因:两个的滚动监听冲突

解决方法:重写ListView或GridView

  1. package com.meritit.lottery.view;
  2.  
  3. import android.content.Context;
  4. import android.util.AttributeSet;
  5. import android.widget.ListView;
  6.  
  7. public class SerialListView extends ListView {
  8.  
  9. public SerialListView(Context context, AttributeSet attrs, int defStyle) {
  10. super(context, attrs, defStyle);
  11. // TODO Auto-generated constructor stub
  12. }
  13.  
  14. public SerialListView(Context context, AttributeSet attrs) {
  15. super(context, attrs);
  16. // TODO Auto-generated constructor stub
  17. }
  18.  
  19. public SerialListView(Context context) {
  20. super(context);
  21. // TODO Auto-generated constructor stub
  22. }
  23.  
  24. /**
  25. * 为了取消滚动效果,可以放入滚动组建中重写了此方法
  26. */
  27. @Override
  28. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  29. int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
  30. MeasureSpec.AT_MOST);
  31. super.onMeasure(widthMeasureSpec, expandSpec);
  32. }
  33.  
  34. }

二、ListView或GridView的外部容器重写onTouchEvent(MotionEvent event)方法

详细请看:http://blog.csdn.net/xxxzhi/article/details/12314775

这类问题解决方法很简单,只需要onTouchEvent返回false即可

例如:

  1. @Override
  2. public boolean onTouchEvent(MotionEvent event) {
  3. // TODO Auto-generated method stub
  4. final int action = event.getAction();
  5. final float x = event.getX();
  6. final float y = event.getY();
  7.  
  8. switch (action) {
  9. case MotionEvent.ACTION_DOWN:
  10. System.out.println("父类点击onTouchEvent");
  11. Log.i("", "onTouchEvent ACTION_DOWN");
  12. if (mVelocityTracker == null) {
  13. mVelocityTracker = VelocityTracker.obtain();
  14. mVelocityTracker.addMovement(event);
  15. }
  16. if (!mScroller.isFinished()){
  17. mScroller.abortAnimation();
  18. }
  19. mLastMotionX = x;
  20. mLastMotionY = y;
  21. break;
  22.  
  23. case MotionEvent.ACTION_MOVE:
  24. System.out.println("父类滑动onTouchEvent");
  25. int deltaX = (int)(mLastMotionX - x);
  26. if (IsCanMove(deltaX))
  27. {
  28. if (mVelocityTracker != null)
  29. {
  30. mVelocityTracker.addMovement(event);
  31. }
  32. mLastMotionX = x;
  33. scrollBy(deltaX, 0);
  34. }
  35.  
  36. break;
  37. case MotionEvent.ACTION_UP:
  38. System.out.println("父类放开onTouchEvent");
  39. int velocityX = 0;
  40. if (mVelocityTracker != null)
  41. {
  42. mVelocityTracker.addMovement(event);
  43. mVelocityTracker.computeCurrentVelocity(1000);
  44. velocityX = (int) mVelocityTracker.getXVelocity();
  45. }
  46. if (velocityX > SNAP_VELOCITY && mCurScreen > 0) {
  47. // Fling enough to move left
  48. Log.e(TAG, "snap left");
  49. snapToScreen(mCurScreen - 1);
  50. } else if (velocityX < -SNAP_VELOCITY
  51. && mCurScreen < getChildCount() - 1) {
  52. // Fling enough to move right
  53. Log.e(TAG, "snap right");
  54. snapToScreen(mCurScreen + 1);
  55. } else {
  56. snapToDestination();
  57. }
  58.  
  59. if (mVelocityTracker != null) {
  60. mVelocityTracker.recycle();
  61. mVelocityTracker = null;
  62. }
  63. // mTouchState = TOUCH_STATE_REST;
  64. break;
  65. }
  66. return false;
  67. }

三、数据传值问题

注意改变Adapter内的数据,如下:list_contents和toparr是改变后的数据

  1. mycqbaseAdapter.contents=list_contents;
  2. mycqtitleAdapter.toparr = toparr;
  3. mycqbaseAdapter.notifyDataSetChanged();
  4. mycqtitleAdapter.notifyDataSetChanged();

有一种错误的写法就是直接调用notifyData方法

  1. mycqbaseAdapter.notifyDataSetChanged();
  2. mycqtitleAdapter.notifyDataSetChanged();

四、ViewGroup中notifyDataSetChanged()无效

  1. @Override
  2. protected void onLayout(boolean changed, int l, int t, int r, int b) {
  3. // if (changed) {
  4. menu_view = getChildAt(0);
  5. content_view = getChildAt(1);
  6.  
  7. content_view.measure(0, 0);
  8. content_view.layout(0, 0, getWidth(), getHeight());
  9. // }
  10. }

注释掉onLayout中的if(changed)即可。

BaseAdapter导致notifyDataSetChanged()无效的四个原因及处理方法的更多相关文章

  1. BaseAdapter导致notifyDataSetChanged()无效的三个原因及处理方法

    原文  http://blog.csdn.net/dawanganban/article/details/21376979 前一段时间在做一个项目的时候遇到了一个关于BaseAdapter的notif ...

  2. .NET 3.5 安装错误的四个原因及解决方法

    .net framework 3.5 安装错误的四个常见原因及解决方法,飓风软件站整理,转载请注明. 1.清除所有版本 .NET Framework  安装错误后在系统中遗留的文件: 如果您以往安装过 ...

  3. Android的setVisibility(View.GONE)无效的问题及原因分析(转)

    出现这种情况很可能是因为设置了animation,并且调用了setFillAfter(true),这就会导致setVisibility无效,只需要调用一下clearAnimation()方法或者去掉s ...

  4. Android的setVisibility(View.GONE)无效的问题及原因分析

    出现这种情况很可能是因为设置了animation,并且调用了setFillAfter(true),这就会导致setVisibility无效,只需要调用一下clearAnimation()方法或者去掉s ...

  5. Android setVisibility(View.GONE)无效的问题及原因分析

    解决方案:可以在setVisibility()之前调用clearAnimation()方法清除掉动画,或setFillAfter(false)(时间上该函数内部也调用了clearAnimation() ...

  6. Android 关于ListView中adapter调用notifyDataSetChanged无效的原因

    话说这个问题已经困扰我很久了,一直找不到原因,我以为只要数据变了,调用adapter的notifyDataSetChanged就会更新列表,最近在做微博帐号管理这一块,想着动态更新列表,数据是变了,但 ...

  7. Android开发之关于ListView中adapter调用notifyDataSetChanged无效的原因

    1.数据源没有更新,调用notifyDataSetChanged无效. 2.数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效. 3.数据源更新了,但是adpter没有 ...

  8. 终于懂了:FWinControls子控件的显示是由Windows来管理,而不是由Delphi来管理(显示透明会导致计算无效区域的方式有所不同——透明的话应减少剪裁区域,所以要进行仔细计算)

    在研究TCustomControl的显示过程中,怎么样都找不到刷新FWinControls并重新显示的代码: procedure TWinControl.PaintHandler(var Messag ...

  9. 压缩感知中的lp球:p范数最优化为什么总会导致一个稀疏的解的原因

    转自:彬彬有礼. 压缩感知中的lp球:p范数最优化为什么总会导致一个稀疏的解的原因 http://blog.csdn.net/jbb0523/article/details/40268943 题目: ...

随机推荐

  1. HDU 5768 Lucky7(CRT+容斥原理)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5768 [题目大意] 求出一个区间内7的倍数中,对于每个ai取模不等于bi的数的个数. [题解] 首 ...

  2. 解决android加载图片时内存溢出问题

    尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过jav ...

  3. c/c++中宏定义##连接符 和#符的使用

    C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结.关于#和##在C语言的宏中,#的功能是将其后面的宏 ...

  4. Insert into a Cyclic Sorted List

    Given a node from a cyclic linked list which has been sorted, write a function to insert a value int ...

  5. Android 手机上安装并运行 Ubuntu 12.04

    ubuntu.sh脚本的原地址变动了,导致下载不了,现在更新了网盘地址.小技巧:遇到一些下载失效的时候可以试一试p2p下载工具(如 easyMule.迅雷等)试一试,说不定有人分享过~* —————— ...

  6. iframe 自适应高度、宽度

    示例: <iframe id="zyms" frameborder="0" scrolling="yes" style="w ...

  7. 使得fiddler来抓包查看微信浏览器的网页源码

    需要工具:http://www.telerik.com/fiddler 下载安装后 第二步: 打开这个选项: 设置代理:allow remote computer to connect  端口为888 ...

  8. React使用笔记(3)-React Event Listener

    Date: 2015-11-28 12:18 Category: Web Tags: JavaScript Author: 刘理想 [toc] 1. 构造基本结构 首先,我们先创建一个按钮,一个输入框 ...

  9. The process "E:\Qt\4.8.5\bin\qmake.exe" exited with code 2.(不能包含中文路径,qmake够弱智的)

    打开某个项目的时候,编译出现类似的错误 21:46:44: The process "E:\Qt\4.8.5\bin\qmake.exe" exited with code 2. ...

  10. JSTL与EL(转)

    基本使用                   <c:forEach items="${deptList}" var="dept">  <div ...