BaseAdapter导致notifyDataSetChanged()无效的四个原因及处理方法
来源:互联网 发布:淘宝店铺成功推广案例 编辑:程序博客网 时间:2024/05/16 14:23
前一段时间在做一个项目的时候遇到了一个关于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}/** * 为了取消滚动效果,可以放入滚动组建中重写了此方法 */@Overrideprotected 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即可
例如:
@Overridepublic 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)即可。
6 0
- BaseAdapter导致notifyDataSetChanged()无效的四个原因及处理方法
- BaseAdapter导致notifyDataSetChanged()无效的四个原因及处理方法
- 60BaseAdapter导致notifyDataSetChanged()无效的几个原因及处理方法
- 1.导致Listview的NotifyDataSetChanged方法无效的原因
- BaseAdapter的notifyDataSetChanged方法
- BaseAdapter 设置 notifyDataSetChanged 无效
- Recyclerview调用notifyDataSetChanged()方法无效原因
- 导致notifyDataSetChanged无效的一个错误
- 导致notifyDataSetChanged无效的一个错误
- android 导致notifyDataSetChanged无效的一个错误
- adapter调用notifyDataSetChanged 无效的原因
- notifyDataSetChanged()无效原因
- notifyDataSetChanged()无效原因
- notifyDataSetChanged()无效原因
- notifyDataSetChanged()无效原因
- 关于ListView的Adapter在调用notifyDataSetChanged()方法无效的原因
- 重写BaseAdapter的四个方法详解
- BaseAdapter需实现的四个方法介绍
- Android进阶练习 - 高效显示Bitmap(管理Bitmap内存)
- java的覆盖和隐藏的区别
- XMPP协议原理及相关信息
- 在jsff中使用javascript问题
- centos 中安装配置cvs
- BaseAdapter导致notifyDataSetChanged()无效的四个原因及处理方法
- UIViewController的生命周期和didReceiveMemoryWarning后的流程
- nginx的upstream(解决session问题)
- 网上搜集
- MongoDB开发学习(1)开天辟地,经典入门
- OPENDATASOURCE 用法
- Oracle修改表空间大小
- javascript就这么回事
- SQL注入原理解析入门教程