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();
时间: 2024-12-08 20:24:51

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

导致Tomcat启动过程缓慢的原因及解决方法

1.现象 在CentOS启动Tomcat时,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的.Tocmat的Session ID是通过SHA1算法计算得到的, 计算Session ID的时候必须有一个密钥.为了提高安全性Tomcat在启动的时候会通过随机生成一个密钥. 22-Apr-2017 19:33:07.623 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGene

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

出现这种情况很可能是因为设置了animation,并且调用了setFillAfter(true),这就会导致setVisibility无效,只需要调用一下clearAnimation()方法或者去掉setFillAfter(true)语句即可. 实验证明只要在setVisibility之前设置View的mCurrentAnimation为null就可以,因此调用setAnimation(null)也是可以的.从源码来看setFillAfter为false时也会间接导致调用clearAnimati

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

1.数据源没有更新,调用notifyDataSetChanged无效. 2.数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效. 3.数据源更新了,但是adpter没有收到消息通知,无法动态更新列表. 我遇到的问题是:数据源更新了,但是adapter中的数据源没有更新,所以造成调用notifyDataSetChanged无效

mAdapter.notifyDataSetChanged无效的问题

现象 使用fastjson解析出的数组直接放到mData中,然后调用notifyDataSetChanged无效 原因 有以下三个原因:(https://blog.csdn.net/whitley_gong/article/details/50562634) 1.数据源没有更新,调用notifyDataSetChanged无效. 2.数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效. 3.数据源更新了,但是adpter没有收到消息通知,无法动态更新列表. 一般来

陈松松:新人操作视频营销最容易失败的三个原因

这是我写的第91篇原创视频营销文章 陈松松,6年视频营销实战经验 新人操作视频营销最容易失败,这里主要有三个原因: 第一点,不知道聚焦 不聚焦是新手失败最重要的因素, 很多新手总以为掌握的方法越多,效果越好, 所以一开始,这学一点,那学一点, 反正最后学的五花八门,哪个也没掌握. 送你一句: 当你在同一时间内做一件事情的时候,你的成功率是100%: 当你在同一时间内做两件事情的时候,成功率仅有3%了: 当你在同一时间内做3件事情的时候,成功率几乎为0: 所以,新人在初期必须聚焦三点: ①方法聚焦

Div+CSS网页布局中CSS无效的十个常见原因

学习Div+CSS网页布局的知识,可是兄弟连validation有时难以操作,但用它你可以查看由版面设计引起的差错,验证程序抛出大量差错和警告,说明你的XHTML尚未完善,可能无法在不同浏览器上保持一致功能,下面十个细微的失效问题难住了大批程序员,本文就告诉你如何解决,在本文开始前介绍一些使用兄弟连PHP培训的基础div+css验证程序时需要注意的问题. 1.不要担心验证程序的警告:如果验证程序说发现12处错误以及83处警告,不要理它,继续进行下一步. 2.一次更正一个错误:按顺序进展工作,从上

有些 where 条件会导致索引无效

在查询中,WHERE 条件也是一个比较重要的因素,尽量少并且是合理的 where条件是徆重要的,尽量在多个条件的时候,把会提取尽量少数据量的条件放在前面,减少后一个 where 条件的查询时间.有些 where 条件会导致索引无效:? 1.where 子句的查询条件里有!=,MySQL 将无法使用索引. ? 2.where 子句使用了 Mysql 函数的时候,索引将无效,比如:select * from tbwhere left(name, 4) = 'xxx' ? 3.使用 LIKE 迕行搜索

使用 ADOX 将 Table 添加到 Catalog 时报“类型无效”的原因和解决方法

http://blog.csdn.net/kfhzy/article/details/6020283 http://blog.csdn.net/kfhzy/article/details/6020545 李维的代码,原来链接的是MS SQL,改成ACCESS后,报 类型无效 错误 原因 除了 adDBTimeStamp 这样的 明显不支持的数据类型外,一般的,也有区别,adVarChar 在ACCESS里是adVarWChar procedure TfrmCreateTable.btnCreat

解决导致kdm无法正常启动的原因

因为 ~/.bash_profile 和 ~/.xinitrc中加入了 export XAUTHORITY="/tmp/${USER}.Xauthority" 所以每次启动桌面都无法成功 注释掉后即可正常进入桌面 使用登录管理器后,会调用 ~/.xprofile的变量,因此需要注意 case ${INPUT_APP} in fcitx) # 使用小企鹅输入法 export XIM=fcitx export XMODIFIERS="@im=fcitx" export