`

2013.03.19(7)———android scrollview和listview共存的问题

阅读更多
2013.03.19(7)———android scrollview和listview共存的问题


ScrollView嵌套GridView或者是ListView时,就会莫名其妙的出现问题,这里 我总结一下 我遇到的问题 总共有两个



1、listview显示不完整

参考:http://www.2cto.com/kf/201204/127363.html

这个可以自定义一下listview,如下

public class MyListView extends ListView {
    public MyListView(Context context) {
        super(context);
    }

    public MyListView(Context context, android.util.AttributeSet attrs) {
        super(context, attrs);
    }

    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
       int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}




这样 listview 就可以完整显示了



2、listview滚动加载失效

一般我写listview滚动加载 ,都是利用onScrollChange这个函数,如下

@Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if(scrollState == OnScrollListener.SCROLL_STATE_IDLE){
            if(view.getLastVisiblePosition()==(view.getCount()-1)){
                this.loadData();
            }
        }
    }


    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
    }




然后


mLst.setOnScrollListener(this);



但是 当ListView在Scrollview里面的时候 这个就不管用了 ,为了解决这个问题,我们可以监听scrollview滚动到底部的事件 然后 来加载listview数据

参考:http://gundumw100.iteye.com/blog/1164066

如下所示代码

mScl.setOnTouchListener(this);

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        break;
    case MotionEvent.ACTION_UP:
        mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SCROLL_BOTTOM), 200);
        break;

    default:
        break;
    }
    return false;
}
//handler
private Handler mHandler = new Handler(){

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if(_dialog!=null && _dialog.isShowing()){
            _dialog.dismiss();
        }
        switch(msg.what){
        case MSG_SCROLL_BOTTOM:
            if (mLayRoot.getHeight() <= mScl.getScrollY() + mScl.getHeight()) {//判断是否触底
                System.out.println("on bottom!");
                if(mIndexStart==0){
                    if(mArrComment.size() >= (mIndexShow-1) * DBOpenHelper.PAGE_COUNT){
                        mPrg.setVisibility(View.VISIBLE);
                        new Thread(new LoadCommentThread()).start();
                }
                }
            }
            break;
        }
    }
    
};






分享到:
评论
1 楼 hold_on 2013-03-27  
我想不通 用listView的时候为什么要用scrollView再包裹一层,
难不成scrollView里还包含其他组件,假如是的话,那么ACTION_MOVE
事件是scrollView响应还是listView响应,应该有个明确的需求吧

然后再通过onInterceptTouchEvent 来决定是否要拦截事件

相关推荐

Global site tag (gtag.js) - Google Analytics