設置滾動監聽判斷ListView的滾動方向同時獲取屏幕高度、ListView實際高度,判斷是否需要展示返回頂部按鈕
package
com.zihao.activity;
import
java.util.ArrayList;
import
java.util.List;
import
com.zihao.adapter.MyAdapter;
import
com.zihao.utils.ScreenUtil;
import
android.os.Bundle;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.AbsListView;
import
android.widget.AbsListView.OnScrollListener;
import
android.widget.Button;
import
android.widget.ListView;
import
android.app.Activity;
/**
* 主界面
*
* @author zihao
* @details 因為有些手機是有虛擬按鍵的(在計算屏幕分辨率的時候,有些可以去除掉虛擬區域的區域->如三星,有些不行->如MX3),為了計算的准確性,
* 各位可以設置Activity為Theme
* .NoTitleBar.Fullscreen填滿屏幕(解決類似MX3這種在計算過程中把虛擬鍵盤算入屏幕高度的)。
*/
public
class
MainActivity
extends
Activity
implements
OnClickListener {
private
ListView listView;
// List數據列表
private
Button toTopBtn;
// 返回頂部的按鈕
private
MyAdapter adapter;
private
boolean
scrollFlag =
false
;
// 標記是否滑動
private
int
lastVisibleItemPosition =
0
;
// 標記上次滑動位置
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
/**
* 初始化視圖
*/
private
void
initView() {
listView = (ListView) findViewById(R.id.my_listView);
toTopBtn = (Button) findViewById(R.id.top_btn);
adapter =
new
MyAdapter(
this
, getTitleDatas());
listView.setAdapter(adapter);
toTopBtn.setOnClickListener(
this
);
listView.setOnScrollListener(
new
OnScrollListener() {
@Override
public
void
onScrollStateChanged(AbsListView view,
int
scrollState) {
// TODO Auto-generated method stub
switch
(scrollState) {
// 當不滾動時
case
OnScrollListener.SCROLL_STATE_IDLE:
// 是當屏幕停止滾動時
scrollFlag =
false
;
// 判斷滾動到底部
if
(listView.getLastVisiblePosition() == (listView
.getCount() -
1
)) {
toTopBtn.setVisibility(View.VISIBLE);
}
// 判斷滾動到頂部
if
(listView.getFirstVisiblePosition() ==
0
) {
toTopBtn.setVisibility(View.GONE);
}
break
;
case
OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
// 滾動時
scrollFlag =
true
;
break
;
case
OnScrollListener.SCROLL_STATE_FLING:
// 是當用戶由於之前划動屏幕並抬起手指,屏幕產生慣性滑動時
scrollFlag =
false
;
break
;
}
}
/**
* firstVisibleItem:當前能看見的第一個列表項ID(從0開始)
* visibleItemCount:當前能看見的列表項個數(小半個也算) totalItemCount:列表項共數
*/
@Override
public
void
onScroll(AbsListView view,
int
firstVisibleItem,
int
visibleItemCount,
int
totalItemCount) {
// 當開始滑動且ListView底部的Y軸點超出屏幕最大范圍時,顯示或隱藏頂部按鈕
if
(scrollFlag
&& ScreenUtil.getScreenViewBottomHeight(listView) >= ScreenUtil
.getScreenHeight(MainActivity.
this
)) {
if
(firstVisibleItem > lastVisibleItemPosition) {
// 上滑
toTopBtn.setVisibility(View.VISIBLE);
}
else
if
(firstVisibleItem < lastVisibleItemPosition) {
// 下滑
toTopBtn.setVisibility(View.GONE);
}
else
{
return
;
}
lastVisibleItemPosition = firstVisibleItem;
}
}
});
}
/**
* 獲取標題數據列表
*
* @return
*/
private
List<string> getTitleDatas() {
List<string> titleArray =
new
ArrayList<string>();
for
(
int
i =
0
; i <
30
; i++) {
titleArray.add(
"這是第"
+ i +
"個item"
);
}
return
titleArray;
}
/**
* 滾動ListView到指定位置
*
* @param pos
*/
private
void
setListViewPos(
int
pos) {
if
(android.os.Build.VERSION.SDK_INT >=
8
) {
listView.smoothScrollToPosition(pos);
}
else
{
listView.setSelection(pos);
}
}
@Override
public
void
onClick(View v) {
// TODO Auto-generated method stub
switch
(v.getId()) {
case
R.id.top_btn:
// 點擊按鈕返回到ListView的第一項
setListViewPos(
0
);
break
;
}
}
}</string></string></string>
來源:
