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

简介: 原文  http://blog.csdn.net/dawanganban/article/details/21376979   前一段时间在做一个项目的时候遇到了一个关于BaseAdapter的notifyDataSetChanged()方法无效问题,当时在网上搜了一个解决方法,今天又遇到了一个类似的问题,我在这里做个记录,防止以后再次发生,或者其他朋友再次遇到。

原文  http://blog.csdn.net/dawanganban/article/details/21376979

 

前一段时间在做一个项目的时候遇到了一个关于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();
目录
相关文章
|
3月前
|
缓存 搜索推荐 Apache
301/302重定向全面指南:从原理到实践
HTTP重定向是Web开发中常用技术,301和302状态码用于不同场景。301表示资源永久迁移,适用于域名更换或结构调整,搜索引擎会更新链接并传递权重;302为临时跳转,适用于登录后跳转或短链接服务,不更改原页面权重。二者在缓存、SEO影响及请求方法处理上存在显著差异。合理配置服务器(如Apache、Nginx或IIS)并遵循最佳实践,有助于提升用户体验与网站SEO表现。
367 0
|
9月前
|
IDE 程序员 API
一文彻底拿捏DevEco Studio的使用小技巧
本文介绍了DevEco Studio的安装与使用,包括其特性、常用快捷键、设置中文环境和文件注释模板等内容。DevEco Studio是华为为HarmonyOS开发者提供的集成开发环境(IDE),最新版本5.0.0增加了多项功能,如工程外模块代码支持、构建字节码har包等,极大提升了开发效率。通过简单步骤即可完成安装,并能轻松查阅组件API文档。跟随程序员Feri一起快速掌握鸿蒙开发!
1026 78
|
12月前
|
前端开发 IDE 数据库连接
ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD
本文详细介绍了ThinkPHP6中模型层的使用,包括模型属性设置、表映射关系、以及如何在控制层中使用模型层进行CRUD操作。
ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD
|
监控 安全 中间件
Python Django 后端架构开发: 中间件架构设计
Python Django 后端架构开发: 中间件架构设计
229 1
|
消息中间件 存储 缓存
RecyclerView 刷新列表数据的 notifyDataSetChanged() 为什么是昂贵的?
当列表数据变更时,调用 notifyDataSetChanged() 是最省事的。无需关心变更的细节,一股脑统统刷一遍就完事了。但这样做也是最昂贵的。读完这一篇源码走查就知道为啥它这么昂贵了。
686 0
|
Android开发
android 自定义登陆对话框基类封装,且随着软键盘的弹起自动移动位置
android 自定义登陆对话框基类封装,且随着软键盘的弹起自动移动位置
|
Dubbo Java 应用服务中间件
Maven依赖管理:控制依赖的传递
Maven依赖管理:控制依赖的传递
425 0
|
Android开发
全网最优雅安卓列表项可见性检测
全网最优雅安卓列表项可见性检测
317 0
|
存储 运维 监控
Redis最佳实践:7个维度+43条使用规范,带你彻底玩转Redis | 附实践清单
Redis最佳实践:7个维度+43条使用规范,带你彻底玩转Redis | 附实践清单