Listview onScrollListener使列表回到顶部

onSCroll在listview滑动过程中被调用,可以获取到listview有多少条item以及现在显示到了第几条等等一些信息。
onScrollStateChanged在listview状态改变时被调用,可以用来获取当前listview的状态:空闲SCROLL_STATE_IDLE 、滑动SCROLL_STATE_TOUCH_SCROLL和惯性滑动SCROLL_STATE_FLING

public class ListActivity extends Activity implements OnClickListener {

    private ListView listView;// ListView数据列表
    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_list);

        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() {
            //onScrollStateChanged 用于监听ListView滑动状态的变化
            @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(ListActivity.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 < 50; 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;
        }
    }

}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值