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

BaseAdapter导致notifyDataSetChanged()无效的四个原因及处理方法前一段时间在做一个项目的时候遇到了一个关于BaseAdapter的notifyDataSetChanged()方法无效问题,当时在网上搜了一个解决方法,今天又遇到了一个类似的问题,我在这里做个记录,防止以后再次发生,或者其他朋友再次遇到。一、ScrollView中嵌套ListView或GridView原因:两个的滚动监听冲突解决方法:重写ListView或GridViewpackagecom.m

大家好,又见面了,我是你们的朋友全栈君。

前一段时间在做一个项目的时候遇到了一个关于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)即可。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150292.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android AutoSize 失效处理

    Android AutoSize 失效处理重写当前getResources方法//***************************↓↓↓处理autosize失效↓↓↓********************************//overridefungetResources():Resources{returnsuper.getResources()}//***************************↑↑↑处理autosize失效↑↑↑********************************.

    2022年5月28日
    157
  • 女生做java开发最多做几年,附赠复习资料

    女生做java开发最多做几年,附赠复习资料前言疫情过去,真正的春暖花开又回来了,时不时的可以和朋友约个饭,感慨今年的工作竞争压力很大,工作很不好找。作为一个开发人员,你是否面上了理想的公司,拿到了理想中的薪资?作为程序员,跳槽就是最好的涨薪方式。前提当然是你有足够实力,而不是只会纸上谈兵。面试准备不充分,就是浪费时间,更是对自己不负责任。今天给大家分享一份由粉丝投稿,我精心整理出来的一份1200页Java架构面试专题(文末见面试答案),绝大部分都是一线大厂的面试真题,可以根据这份面试专题查漏补缺,希望能够帮助你尽快找到工作!kafka面试基

    2022年7月7日
    18
  • 毫米波雷达信号处理系统有哪些_毫米波雷达的缺点

    毫米波雷达信号处理系统有哪些_毫米波雷达的缺点毫米波雷达信号处理系统(WRSP)是我杭州淞柏科技有限公司-杭州淞柏科技有限公司研制的全功能高端雷达信号处理器,该处理器采用了脱机运行、网络接口,采用DIFR硬件平台,适用机载、舰载船载、车载等各种平台雷达。在设计上采用高集成方案,高速DSP+FPGA完成所有雷达处理模式,可支持各种不同方式的脉冲压缩和补盲。系统结构如下图所示:WRSP硬件部分集成DIFR数字中频接收机以及WRSP信号处理器(后简称信号处理器)于一体。DIFR可完成所有的中频处理,任意波………

    2022年10月19日
    3
  • 盗版猖獗、开发难……VR游戏进阶之路“道阻且长”

    盗版猖獗、开发难……VR游戏进阶之路“道阻且长”

    2022年3月13日
    49
  • 给地址栏添加图标_地址栏图标是什么

    给地址栏添加图标_地址栏图标是什么不管是百度,新浪还是其他的网站,只要在浏览器上打开后便能看到一个醒目的小图标,知道是怎么做到的吗?其实很简单。shortcutdemothisisatest!就是上面这句代码起的作用,但

    2022年8月4日
    7
  • python中 global_python中round的用法

    python中 global_python中round的用法在Python中,一个变量的scope范围从小到大分成4部分:LocalScope(也可以看成是当前函数形成的scope),EnclosingScope(简单来说,就是外层函数形成的scope),GlobalScope(就是当前文件形成的scope),BuiltinsScope(简单来说,就是Python内置的变量位于最顶层的scope)。当Python开始查找一个非限定的变量名时(像ob…

    2025年8月26日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号