我用到viewgroup有三个界面,通过滑动来翻页,我现在里面数据有变化,需要刷新,我用adapter.notifyDataSetChanged();
可只刷新了第三个界面的值,不管我排版成几个界面,都只刷新了最后一个界面的内容,请高手们来帮帮我

解决方案 »

  1.   

    package ycq.demo;import java.util.ArrayList;
    import java.util.List;import android.content.Context;
    import android.content.pm.PackageManager;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.View.OnClickListener;
    import android.widget.BaseAdapter;
    import android.widget.ImageButton;
    import android.widget.ImageView;
    import android.widget.Toast;
    //import android.widget.ImageView;
    import android.widget.TextView;public class AppAdapter extends BaseAdapter {
    private List<Image> mList;
    private Context mContext;
    public static final int APP_PAGE_SIZE = 6;
    AppItem appItem;
    public AppAdapter(Context context, List<Image> list, int page) {
    mContext = context;
    mList = new ArrayList<Image>();
    int i = page * APP_PAGE_SIZE;
    int iEnd = i+APP_PAGE_SIZE;
    while ((i<list.size())&&(i<iEnd)){
    mList.add(list.get(i));
    i++;
    }
    }
    public int getCount() {
    // TODO Auto-generated method stub
    return mList.size();
    } public Object getItem(int position) {
    // TODO Auto-generated method stub
    return mList.get(position);
    } public long getItemId(int position){
    // TODO Auto-generated method stub
    return position;
    }
    @Override public void notifyDataSetChanged() {
    super.notifyDataSetChanged(); 

    public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    Image imgg = mList.get(position);

    // parent.invalidate();
    //AppItem appItem;
    if (convertView == null) {
    View v = LayoutInflater.from(mContext).inflate(R.layout.app_item, null);

    appItem = new AppItem();
    appItem.mAppIcon = (ImageView)v.findViewById(R.id.ivAppIcon);
    appItem.mAppName = (TextView)v.findViewById(R.id.tvAppName);

    appItem.name=imgg.getName();
    Log.v("ddd1", "dddddddddddddddddddddddddd");
    v.setTag(appItem);
    convertView = v;
    } else {
    appItem = (AppItem)convertView.getTag();
    Log.v("ddd2", "dddddddddddddddddddddddddd");
    }
    // set the icon
    if(imgg.getState().equals("0"))
    {
    appItem.mAppIcon.setImageResource(imgg.getImgO());
    }else
    {
    appItem.mAppIcon.setImageResource(imgg.getImgN());
    }
    appItem.state=imgg.getState();

    appItem.Id=imgg.getCommandId();
    // set the app name
    appItem.mAppName.setText(imgg.getId()+"");
    //parent.invalidate();
    //appItem.mAppIcon.setOnClickListener(new listener());
    return convertView;
    } /**
     *  * @author Yao.GUET
     *
     */
    class AppItem {
    //ImageButton mAppIcon;
    ImageView mAppIcon;
    String name;
    String state;
    int Id;
    TextView mAppName;
    }
    }
    这个就是继承了baseadapter的类,我觉得主要原因在这个类里
      

  2.   

    public AppAdapter(Context context, List<Image> list, int page) {
    mContext = context;
    mList = new ArrayList<Image>();
    int i = page * APP_PAGE_SIZE;
    int iEnd = i+APP_PAGE_SIZE;
    while ((i<list.size())&&(i<iEnd)){
    mList.add(list.get(i));
    i++;
    }
    }
    我觉得问题是在上面那个类的这个构造方法里
      

  3.   

    我知道原因了 
    Adapter.notifyDataSetChanged();
    你在外面肯定是这样来调用的吧 Adapter对象只是最后一个对象 你得用其它两个对象也调用notifyDataSetChanged();
      

  4.   

    对,我也觉得是这个原因,就是不知道怎么解决,前两个对象要怎么调用
    public void initViews() {
            // get all apps 
            final List<Image> apps = list;
            // the total pages
            final int PageCount = (int)Math.ceil(apps.size()/APP_PAGE_SIZE);
            Log.e(TAG, "size:"+apps.size()+" page:"+PageCount);
            for (int i=0; i<PageCount; i++) {
              appPage = new GridView(this);
             // get the "i" page data
              app=new AppAdapter(this,apps,i);
             appPage.setAdapter(app);
             appPage.setNumColumns(4);
             appPage.setOnItemClickListener(listener);
             mScrollLayout.addView(appPage);
            
            }
    }
    这是我产生对象的方法
      

  5.   

    我就是想达到你说的那效果,可我不知道怎么实现啊
    package ycq.demo;import android.content.Context;
    import android.graphics.Canvas;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.VelocityTracker;
    import android.view.View;
    import android.view.ViewConfiguration;
    import android.view.ViewGroup;
    import android.widget.Scroller;/**
     * WorkSapce @author Yao.GUET
     * blog: http://blog.csdn.net/Yao_GUET
     * date: 2011-05-04
     */
    public class ScrollLayout extends ViewGroup { private static final String TAG = "ScrollLayout";
    private Scroller mScroller;
    private VelocityTracker mVelocityTracker;

    private int mCurScreen;
    private int mDefaultScreen = 0;

    private static final int TOUCH_STATE_REST = 0;
    private static final int TOUCH_STATE_SCROLLING = 1;

    private static final int SNAP_VELOCITY = 600;

    private int mTouchState = TOUCH_STATE_REST;
    private int mTouchSlop;
    private float mLastMotionX;
    private float mLastMotionY; public ScrollLayout(Context context, AttributeSet attrs) {

    this(context, attrs, 0);
    Log.v("1","ddd");
    // TODO Auto-generated constructor stub
    } public ScrollLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    Log.v("2","ddd");
    // TODO Auto-generated constructor stub
    mScroller = new Scroller(context);
    mCurScreen = mDefaultScreen;
    mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
    } @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
    // TODO Auto-generated method stub
    Log.e(TAG, "onLayout");
    //if (changed) {
    Log.v("3","ddd");
    int childLeft = 0;
    final int childCount = getChildCount();

    for (int i=0; i<childCount; i++) {
    final View childView = getChildAt(i);
    if (childView.getVisibility() != View.GONE) {
    final int childWidth = childView.getMeasuredWidth();
    childView.layout(childLeft, 0, 
    childLeft+childWidth, childView.getMeasuredHeight());
    childLeft += childWidth;

    }

    //}
    }
    }
        @Override  
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {   
         Log.e(TAG, "onMeasure");
         Log.v("4","ddd");
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);   
            invalidate();
            final int width = MeasureSpec.getSize(widthMeasureSpec);   
            final int widthMode = MeasureSpec.getMode(widthMeasureSpec);   
            if (widthMode != MeasureSpec.EXACTLY) {   
                throw new IllegalStateException("ScrollLayout only canmCurScreen run at EXACTLY mode!"); 
            }   
      
            final int heightMode = MeasureSpec.getMode(heightMeasureSpec);   
            if (heightMode != MeasureSpec.EXACTLY) {   
                throw new IllegalStateException("ScrollLayout only can run at EXACTLY mode!");
            }   
      
            // The children are given the same width and height as the scrollLayout   
            final int count = getChildCount();   
            for (int i = 0; i < count; i++) {   
                getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);   
            }   
            // Log.e(TAG, "moving to screen "+mCurScreen);   
            scrollTo(mCurScreen * width, 0);   
           
            
        }  
        
        /**
         * According to the position of current layout
         * scroll to the destination page.
         */
        public void snapToDestination(){
         Log.v("5","ddd");
         final int screenWidth = getWidth();
         final int destScreen = (getScrollX()+ screenWidth/2)/screenWidth;
         snapToScreen(destScreen);
        }
        
        public void snapToScreen(int whichScreen) {
         Log.v("6","ddd");
         // get the valid layout page
         whichScreen = Math.max(0, Math.min(whichScreen, getChildCount()-1));
         if (getScrollX() != (whichScreen*getWidth())) {
        
         final int delta = whichScreen*getWidth()-getScrollX();
         mScroller.startScroll(getScrollX(), 0,delta, 0, Math.abs(delta)*2);
         mCurScreen = whichScreen;
         Log.v("aaa",mCurScreen+"");
         invalidate(); // Redraw the layout
        
         }
        }
        public void setToScreen(int whichScreen) {
         Log.v("7",whichScreen+"");
         whichScreen = Math.max(0, Math.min(whichScreen, getChildCount()-1));
         mCurScreen = whichScreen;
         scrollTo(whichScreen*getWidth(), 0);
        
           
        }
        
        public int getCurScreen() {
        
         Log.v("8",mCurScreen+"");
         return mCurScreen;
        }
        
    @Override
    public void computeScroll(){
    // TODO Auto-generated method stub
    Log.v("9","ddd");
    if (mScroller.computeScrollOffset()) {
    scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
    postInvalidate();
    }
    } @Override
    public boolean onTouchEvent(MotionEvent event) {
    Log.v("10","ddd");
    // TODO Auto-generated method stub

    if (mVelocityTracker == null) {
    mVelocityTracker = VelocityTracker.obtain();
    }
    mVelocityTracker.addMovement(event);

    final int action = event.getAction();
    final float x = event.getX();
    final float y = event.getY();
    switch (action) {
    case MotionEvent.ACTION_DOWN:
    Log.e(TAG, "event down!");
    if (!mScroller.isFinished()){
    mScroller.abortAnimation();
    //invalidate();
    }
    mLastMotionX = x;
    break;

    case MotionEvent.ACTION_MOVE:
    int deltaX = (int)(mLastMotionX - x);
    mLastMotionX = x;

                scrollBy(deltaX, 0);
    break;

    case MotionEvent.ACTION_UP:
    Log.e(TAG, "event : up");   
                // if (mTouchState == TOUCH_STATE_SCROLLING) {   
                final VelocityTracker velocityTracker = mVelocityTracker;   
                velocityTracker.computeCurrentVelocity(1000);   
                int velocityX = (int) velocityTracker.getXVelocity();               Log.e(TAG, "velocityX:"+velocityX); 
               
                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;
    case MotionEvent.ACTION_CANCEL:
    mTouchState = TOUCH_STATE_REST;
    break;
    }

    return true;
    } @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
    // TODO Auto-generated method stub
    Log.e(TAG, "onInterceptTouchEvent-slop:"+mTouchSlop);
    Log.v("11","ddd");
    final int action = ev.getAction();
    if ((action == MotionEvent.ACTION_MOVE) && 
    (mTouchState != TOUCH_STATE_REST)) {
    return true;
    }

    final float x = ev.getX();
    final float y = ev.getY();

    switch (action) {
    case MotionEvent.ACTION_MOVE:
    final int xDiff = (int)Math.abs(mLastMotionX-x);
    if (xDiff>mTouchSlop) {
    mTouchState = TOUCH_STATE_SCROLLING;

    }
    break;

    case MotionEvent.ACTION_DOWN:
    mLastMotionX = x;
    mLastMotionY = y;
    mTouchState = mScroller.isFinished()? TOUCH_STATE_REST : TOUCH_STATE_SCROLLING;
    break;

    case MotionEvent.ACTION_CANCEL:
    case MotionEvent.ACTION_UP:
    mTouchState = TOUCH_STATE_REST;
    break;
    }

    return mTouchState != TOUCH_STATE_REST;
    }

    }这是我翻页效果的代码,我弄了好几天,今天终于遇到了高手
      

  6.   

      for (int i=0; i<PageCount; i++) {
      appPage = new GridView(this);
      // get the "i" page data
      app=new AppAdapter(this,apps,i);
      appPage.setAdapter(app);
      appPage.setNumColumns(4);
      appPage.setOnItemClickListener(listener);
      mScrollLayout.addView(appPage);
     
      }
    这个是你写的代码 在for循环中去 执行 从新去new 会覆盖之前的值 楼主你好好看看这里 我感觉这里有问题, 我可不是高手喔
    appPage = new GridView(this);
    app=new AppAdapter(this,apps,i);可以每次循环就又从新new了这个对象
      

  7.   

    我这代码也是网上找的,我改了改就是,appPage = new GridView(this);
    app=new AppAdapter(this,apps,i);这个地方我认为这样写也没什么错,因为不同页就不同对象,我是新手,思路不怎么清晰,xys289187120有什么好方法吗