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();
目录
相关文章
|
算法 API 开发工具
拒绝手动Notifydatasetchanged(),使用ListAdapter高效完成RecyclerView刷新
拒绝手动Notifydatasetchanged(),使用ListAdapter高效完成RecyclerView刷新
215 0
|
存储 缓存 开发工具
RecyclerView#Adapter#notifyDataSetChanged方法后,为何还会新建ViewHolder?
RecyclerView#Adapter#notifyDataSetChanged方法后,为何还会新建ViewHolder?
|
XML 前端开发 数据格式
默认状态下,ViewGroup为什么不走onDraw()?
两种代码相同的自定义ViewGroup,只是改变了在xml中ViewGroup的背景,一个就会调用onDraw而另外一个则不会,那么为什么在不改变ViewGroup的情况下不走onDraw方法呢?那么又该如何解决这个问题??
316 1
RecycleView的操作(自定义SnapHelper、ItemDecoration)
RecycleView的操作(自定义SnapHelper、ItemDecoration)
322 0
自定义textview invalidate ()不调用ondraw()可能原因
1.控件大小为0,需要重写onMeasure () 2.onDraw()重写的不是protected 我记得重写已有控件不需要重写测量方法,可能是我记错版本了,有空了在研究研究
1121 0