listview滑动距离

来源:互联网 发布:淘宝上的lolita代购 编辑:程序博客网 时间:2024/05/17 03:09

计算listview滑动的距离以及滑动listview改变titlebar透明度效果

获取listview的滑动距离是关键

(1)listview设置滑动监听
mListView.setOnScrollListener

(2)重写onScroll()方法

先不要看代码,先看代码后面的说明

package com.dgtech.getlistviewscrollheight;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.SparseArray;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends AppCompatActivity {SparseArray recordSp = new SparseArray(0);//设置容器大小,默认是10int mCurrentfirstVisibleItem;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    ListView listView = (ListView) findViewById(R.id.listview);    listView.setAdapter(new MyAdapter());    listView.setOnScrollListener(new AbsListView.OnScrollListener() {        @Override        public void onScrollStateChanged(AbsListView view, int scrollState) {        }        @Override        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {            mCurrentfirstVisibleItem = firstVisibleItem;            View firstView = view.getChildAt(0);//获取当前最顶部的item            if (firstView != null) {                ItemRecod itemRecord = (ItemRecod) recordSp.get(firstVisibleItem);                if (itemRecord == null) {                    itemRecord = new ItemRecod();                }                itemRecord.height = firstView.getHeight();//获取当前最顶部Item的高度                itemRecord.top = firstView.getTop();//获取对应item距离顶部的距离                recordSp.append(firstVisibleItem, itemRecord);//添加键值对设置值                System.out.println("mCurrentfirstVisibleItem: " + mCurrentfirstVisibleItem + "itemRecord.height: " + itemRecord.height + "itemRecord.top: " + itemRecord.top);//                int ScrollY = getScrollY();                System.out.println("ScrollY: " + ScrollY);            }        }    });}//下面这个方法是获取listview滑动距离的方法private int getScrollY() {    int height = 0;    for (int i = 0; i < mCurrentfirstVisibleItem; i++) {        ItemRecod itemRecod = (ItemRecod) recordSp.get(i);        if (itemRecod != null) {            height += itemRecod.height;        }    }    ItemRecod itemRecod = (ItemRecod) recordSp.get(mCurrentfirstVisibleItem);    if (null == itemRecod) {        itemRecod = new ItemRecod();    }    return height - itemRecod.top;}private class ItemRecod {    int height = 0;    int top = 0;}//下面随便写了个adapter,不用看class  MyAdapter extends BaseAdapter{    private TextView textView;    @Override    public int getCount() {        return 100;    }    @Override    public Object getItem(int position) {        TextView textView =  new TextView(MainActivity.this);        textView.setText("ceshi");        return textView;    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        TextView textView =  new TextView(MainActivity.this);        textView.setText("ceshi");        return textView;    }}}

说明:

程序刚加载日志打印:

02-06 10:57:18.578 12040-12040/com.dgtech.getlistviewscrollheight I/System.out: mCurrentfirstVisibleItem: 0itemRecord.height: 57itemRecord.top: 002-06 10:57:18.578 12040-12040/com.dgtech.getlistviewscrollheight I/System.out: ScrollY: 0

这个时候listview还没有滚动,第一个可见条目id是0

滑动一点点:

02-06 11:01:21.438 12040-12040/com.dgtech.getlistviewscrollheight I/System.out: mCurrentfirstVisibleItem: 0 itemRecord.height: 57itemRecord.top: -4102-06 11:01:21.438 12040-12040/com.dgtech.getlistviewscrollheight I/System.out: ScrollY: 41

再滑动一点点:

02-06 11:02:12.248 12040-12040/com.dgtech.getlistviewscrollheight I/System.out: mCurrentfirstVisibleItem: 0 itemRecord.height: 57itemRecord.top: -4902-06 11:02:12.248 12040-12040/com.dgtech.getlistviewscrollheight I/System.out: ScrollY: 49

再滑动一点点:

02-06 11:21:05.898 12040-12040/com.dgtech.getlistviewscrollheight I/System.out: mCurrentfirstVisibleItem: 1 itemRecord.height: 57itemRecord.top: -1702-06 11:21:05.898 12040-12040/com.dgtech.getlistviewscrollheight I/System.out: ScrollY: 74

注意观察什么改变什么没有变

每个item的高度肯定不会变,变化的是当前item距离顶端的距离

画图说明:
这里写图片描述
这里写图片描述

随着滑动listview,mCurrentfirstVisibleItem这个值也会跟着改变.然后我们发现规律:

listview滑动的距离就是已经滑动过去的item的高度总和(这个总和的意思是,比如当前mCurrentfirstVisibleItem这个值是0,说明还没有item滑动过去,这个mCurrentfirstVisibleItem值为1说明item0这个item已经滑动过去了)加上当前第一个可见item距离顶部的距离(绝对值)

说的比较拗口,需要理解

当listview的高度都获取了之后,可以根据这个高度值的变化做很多事情,比如改变某个控件的透明度,是否显示某个控件等,这里不再赘述

0 0