1. 程式人生 > >scrollview巢狀listview滑動,上拉重新整理,衝突等問題

scrollview巢狀listview滑動,上拉重新整理,衝突等問題

谷歌官方是不推薦巢狀的,但是我們現在有好多佈局這樣做會很方便,所以,沒辦法自能自己研究怎麼巢狀嘍,當然不是我研究的,我只是學習別人的,在這紀錄一下,網上其實有好多辦法,比如重寫listview或重寫scrollview,但是感覺太麻煩啦,在網上找了半天找到一個相對簡單的辦法,先記下來吧。
首先scrollview巢狀listview的時候listview的寬度必須固定,比如200dp,要不然執行的時候指揮顯示一條資料,但是固定高度這是不可能的,因為我們要根據不同的機型適配,所以就有人想到辦法,在後臺動態設定高度,其實也就是把listview的高度固定,有多少個控制元件,就多高,這樣listview就永遠不會滑動,但是他的高度再增加,這樣就會超出螢幕,出發scrollview的滑動事件,這樣就能實現我們想要的效果,即把listview的滑動轉變成scrollview的滑動,廢話不多說,上程式碼:
public ViewGroup.LayoutParams getListViewParams() {
        // 通過ListView獲取其中的介面卡adapter
        ListAdapter listAdapter = lv.getAdapter();

        // 宣告預設高度為0
        int totalHeight = 0;
        // 便利ListView所有的item,累加所有item的高度就是ListView的實際高度
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null
, lv); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } // 將累加獲取的totalHeight賦值給LayoutParams的height屬性 ViewGroup.LayoutParams params = lv.getLayoutParams(); params.height = totalHeight + (lv.getDividerHeight() * (listAdapter.getCount() - 1
)); return params; }

在這裡面lv機試listview,這段程式碼在listviewsetAdapter之後呼叫即可,比如:
lv.setAdapter(myadapter);
lv.setLayoutParams(getListViewParams());
這樣就可以讓listview的高度動態增加這樣就可以啦

但是我還有個需求,就是實現上拉重新整理,就是滑動到底部就自動載入新的資料,本來listview是這樣載入的,就是監聽它的滑動事件,程式碼如下:

lv.setOnScrollListener(new OnScrollListener() {

            /**
             * scrollState 
             * 0停止滑動
             * 1 正在滑動
             * 2慣性滑動
             */
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                /*
                    如果isDivPage為true,並且滑動停止,表示已經到達了底部
                */
                if (isDivPage&&scrollState==0) {
                    //在這裡實現載入新資料的方法
                }
            }

            /**
             * firstVisibleItem 顯示的第一條
             * visibleItemCount 有多少條顯示
             * totalItemCount 一共有多少條資料
             */

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                /* isDivPage判斷是否到底部
                根據滑動的時候列印firstVisibleItem和visibleItemCount的值發現,越靠近底部,二者的和越接近totalItemCount,到底部後二者的和剛好等於totalItemCount,所以就可以用isDivPage判斷是否到達底部
                    當firstVisibleItem+visibleItemCount
                */
                isDivPage=((firstVisibleItem+visibleItemCount)==totalItemCount);
                if (isDivPage) {
                    lastID=totalItemCount;
                }
            }
        });

但是在這裡listview已經固定高度,詠古額不會超出,也就是不會滑動,所以這種辦法就放棄啦,但是scrollview卻沒有這個介面,沒辦法用這個辦法判斷是否到達底部,只能再求度娘啦,好在功夫不負有心人,最終還是找到啦,程式碼如下:

scrollview.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                //手指按下呼叫一次
                    break;
                case MotionEvent.ACTION_MOVE:
                //手指按下移動式會一直呼叫
                    //如果在這裡判斷是否到達底部,,會一直載入資料,這樣就會卡死
                    break;
                case MotionEvent.ACTION_UP:
                //手指離開,表示上拉一次,就呼叫一次
                    // 這樣能保證每次手指點選只能呼叫一次
                    int scrollY = v.getScrollY();
                    int height = v.getHeight();
                    int scrollViewMeasuredHeight = new_next_scroll.getChildAt(0).getMeasuredHeight();
                    if (scrollY == 0) {
                        Log.e("scroll", "滑動到了頂端 view.getScrollY()=" + scrollY);
                    }
                    if ((scrollY + height) == scrollViewMeasuredHeight) {
                        // 到達底部,重新整理資料
                        重新整理資料的方法。。。。
                    }
                    break;

                }
                return false;
            }
        });