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

一、ScrollView中嵌套ListView或GridView

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

解决方法:重写ListView或GridView

package com.meritit.lottery.view;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;

public class SerialListView extends ListView {

	public SerialListView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
	}

	public SerialListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	public SerialListView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}

	/**
	 * 为了取消滚动效果,可以放入滚动组建中重写了此方法
	 */
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
				MeasureSpec.AT_MOST);
		super.onMeasure(widthMeasureSpec, expandSpec);
	}

}

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

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

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

例如:

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
	        final int action = event.getAction();
	        final float x = event.getX();
	        final float y = event.getY();    

	        switch (action) {
	        case MotionEvent.ACTION_DOWN:
	        	System.out.println("父类点击onTouchEvent");
	        	  Log.i("", "onTouchEvent  ACTION_DOWN");
	        	if (mVelocityTracker == null) {
			            mVelocityTracker = VelocityTracker.obtain();
			            mVelocityTracker.addMovement(event);
			    }
	            if (!mScroller.isFinished()){
	                mScroller.abortAnimation();
	            }
	            mLastMotionX = x;
	            mLastMotionY = y;
	            break;    

	        case MotionEvent.ACTION_MOVE:
	        	System.out.println("父类滑动onTouchEvent");
		           int deltaX = (int)(mLastMotionX - x);
	        	   if (IsCanMove(deltaX))
	        	   {
	        		 if (mVelocityTracker != null)
	  		         {
	  		            	mVelocityTracker.addMovement(event);
	  		         }
	  	            mLastMotionX = x;
	  	            scrollBy(deltaX, 0);
	        	   }

	           break;
	        case MotionEvent.ACTION_UP:
	        	System.out.println("父类放开onTouchEvent");
	        	int velocityX = 0;
	            if (mVelocityTracker != null)
	            {
	            	mVelocityTracker.addMovement(event);
	            	mVelocityTracker.computeCurrentVelocity(1000);
	            	velocityX = (int) mVelocityTracker.getXVelocity();
	            }
	            if (velocityX > SNAP_VELOCITY && mCurScreen > 0) {
	                // Fling enough to move left
	                Log.e(TAG, "snap left");
	                snapToScreen(mCurScreen - 1);
	            } else if (velocityX < -SNAP_VELOCITY
	                    && mCurScreen < getChildCount() - 1) {
	                // Fling enough to move right
	                Log.e(TAG, "snap right");
	                snapToScreen(mCurScreen + 1);
	            } else {
	                snapToDestination();
	            }      

	            if (mVelocityTracker != null) {
	                mVelocityTracker.recycle();
	                mVelocityTracker = null;
	            }
	      //      mTouchState = TOUCH_STATE_REST;
	            break;
	        }
	        return false;
	}

三、数据传值问题

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

		mycqbaseAdapter.contents=list_contents;
		mycqtitleAdapter.toparr = toparr;
		mycqbaseAdapter.notifyDataSetChanged();
		mycqtitleAdapter.notifyDataSetChanged();

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

		mycqbaseAdapter.notifyDataSetChanged();
		mycqtitleAdapter.notifyDataSetChanged();

四、ViewGroup中notifyDataSetChanged()无效

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// if (changed) {
menu_view = getChildAt(0);
content_view = getChildAt(1);

content_view.measure(0, 0);
content_view.layout(0, 0, getWidth(), getHeight());
// }
}

注释掉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. BZOJ 4300 绝世好题(位运算)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4300 [题目大意] 给出一个序列a,求一个子序列b,使得&和不为0 [题解] ...

  2. JqGrid使用经验

    一.更改分页组件的样式 分页组件中

  3. UVA 11549 Calculator Conundrum (Floyd判圈算法)

    题意:有个老式计算器,每次只能记住一个数字的前n位.现在输入一个整数k,然后反复平方,一直做下去,能得到的最大数是多少.例如,n=1,k=6,那么一次显示:6,3,9,1... 思路:这个题一定会出现 ...

  4. 恢复sudo的权限的命令

    出错的原因:不小心给了/etc/的所有文件的777属性,出现了sudo 的错误. 1.pkexec chmod 0440 /etc/sudoers 2.pkexec chmod 0440 /etc/s ...

  5. UIKit封装的系统动画

    简介 在UIKit中,对UIView封装了很多类方法来进行简单的动画实现,在动画过程中,通过对属性值的修改来完成一系列的效果. 在IOS4以前,主要通过 + beginAnimation + setA ...

  6. js页面loading加载

    <html>     <head>     <title>页面正在载入</title>       <script  language=" ...

  7. JVM典型配置

    堆大小设置: JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存 限制.32位系统下,一般限制在1.5G~2G:64为 ...

  8. Qt之美(一):d指针/p指针详解

    Translated  by  mznewfacer   2011.11.16 首先,看了Xizhi Zhu 的这篇Qt之美(一):D指针/私有实现,对于很多批评不美的同路人,暂且不去评论,只是想支持 ...

  9. Delphi 常用属性说明(超长)

    Delphi组件的常用事件Onclick——当单击时触发这个事件中的代码Onchange——当改变该组件内容时触发其中的代码Oncreate——当创建时触发这个事件中的代码Onclose——当关闭的时 ...

  10. 可以放在html代码中的自动跳转代码

    可以放在html代码中的自动跳转代码 有3种方法可以实现html的页面跳转,1,refresh   2,onload事件中加入代码  3,js实现 1.<html><body> ...