【Android】ListView監聽上下滑動(判斷是否顯示返回頂部按鈕


設置滾動監聽判斷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>
 
來源: 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM