scrollview巢狀listview滑動,上拉重新整理,衝突等問題
阿新 • • 發佈:2019-02-10
谷歌官方是不推薦巢狀的,但是我們現在有好多佈局這樣做會很方便,所以,沒辦法自能自己研究怎麼巢狀嘍,當然不是我研究的,我只是學習別人的,在這紀錄一下,網上其實有好多辦法,比如重寫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;
}
});