【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