参照这位大牛的http://blog.csdn.net/Yao_GUET/article/details/6397197文章,修改了一下小程序,想要达到点击button的时候显示的图片由temp0显示为temp1。经过几番周折解决的一些问题,还有一个问题解决不了,希望牛人指点。
问题是:点击按钮后,temp1的图片没有显示,再点一下键盘上的数字键或者menu等键才会显示出来,请问是什么问题,怎么解决?代码如下:
主文件代码:
public class AllAppList extends Activity {
//测试数据
private Integer[] temp0 = {            
R.drawable.m01s, R.drawable.m02s,            
R.drawable.m03s, R.drawable.m04s,             
R.drawable.m05s, R.drawable.m06s,
R.drawable.m07s, R.drawable.m08s,             
R.drawable.m09s            
};
private Integer[] temp1 = {                        
R.drawable.m013s,R.drawable.m014s,
R.drawable.m015s,R.drawable.m016s,             
R.drawable.m017s,R.drawable.m018s,
R.drawable.m019s,R.drawable.m020s,             
R.drawable.m021s,R.drawable.m022s
};
private static final String TAG = "ScrollLayoutTest";
private ScrollLayout mScrollLayout;
private static final float APP_PAGE_SIZE = 9;
private Context mContext;
private int PageCount ;
private AppAdapter ad;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub

super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
mContext = this;
setContentView(R.layout.main);

mScrollLayout = (ScrollLayout)findViewById(R.id.ScrollLayoutTest);
Button btn = (Button) findViewById(R.id.category);
ad = new AppAdapter(mContext);
//------------------------------------------显示第一组temp0图片
PageCount = (int)Math.ceil(temp0.length/APP_PAGE_SIZE);
for (int i=0; i<PageCount; i++) {
         GridView appPage = new GridView(this);
         // get the "i" page data
         appPage.setAdapter(ad);       
         appPage.setNumColumns(3);
         mScrollLayout.addView(appPage);
        
        }


//----------------------------添加按钮切换到第二组temp1的数据
btn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
temp0 = temp1;
GridView app = (GridView) mScrollLayout.getChildAt(0);
              app.setAdapter(ad);
}});
}

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) {
finish();
return true;
}
return super.onKeyDown(keyCode, event);
}

public class AppAdapter extends BaseAdapter {
private Context mContext;
public static final int APP_PAGE_SIZE = 9;
private PackageManager pm;

public AppAdapter(Context context, Integer[] temp0, int page) {
mContext = context;
}
public int getCount() {
// TODO Auto-generated method stub
return temp0.length;
} public Object getItem(int position) {
// TODO Auto-generated method stub
return temp0[position];
} public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
//Integer appInfo = mList.get(position);
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);

v.setTag(appItem);
convertView = v;
} else {
appItem = (AppItem)convertView.getTag();
}
// set the icon
appItem.mAppIcon.setImageResource(temp0[position]);


return convertView;
}

class AppItem {
ImageView mAppIcon;
}
}
}

解决方案 »

  1.   


    scrolllayout代码(代码没动过,是原作者的代码):
    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);
    // TODO Auto-generated constructor stub
    } public ScrollLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // 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) {
    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");
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);   
      
            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() {
         final int screenWidth = getWidth();
         final int destScreen = (getScrollX()+ screenWidth/2)/screenWidth;
         snapToScreen(destScreen);
        }
        
        public void snapToScreen(int whichScreen) {
         // 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;
         invalidate(); // Redraw the layout
         }
        }
        
        public void setToScreen(int whichScreen) {
         whichScreen = Math.max(0, Math.min(whichScreen, getChildCount()-1));
         mCurScreen = whichScreen;
         scrollTo(whichScreen*getWidth(), 0);
        }
        
        public int getCurScreen() {
         return mCurScreen;
        }
        
    @Override
    public void computeScroll() {
    // TODO Auto-generated method stub
    if (mScroller.computeScrollOffset()) {
    scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
    postInvalidate();
    }
    } @Override
    public boolean onTouchEvent(MotionEvent event) {
    // 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();
    }
    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);

    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;
    }

    }
      

  2.   

    temp0和temp1是放在一个gridview上,点击按钮后,视图没有更新吧
      

  3.   

    把temp0和temp1分别放在两个gridview上,然后更替显示两个gridview,把刷新这种事情交给底层API吧。
      

  4.   

    将onLayout方法的if (changed) {判断去掉试试