ListView/RecycleView区别以及判断是否滑动到顶部和底部

ListView 优化:
1:复用contentView 优化布局,(if contentView==null){}else{}
2:ViewHolder(不需要每次都findViewById)(setTag getTAg)
3:分页加载数据,滑动中不加载图片.

ListView
1 adapter 继承BaseAdapter
2自定义ViewHolder
3分割线用divider设置
4 点击事件
5 addHeadView addFootView

RecycleView
1:adapter 继承RecycleView.Adapter<>
2:ViewHolder 必须继承RecycleView.ViewHolder
3:setadapter 设置样式
new LinearLayoutManager(this) ; -> 表示ListView
new GridLayoutManager(this , 3) ; -> 表示GridView,3表示1列显示的个数
new StraggeredGridLayoutManager() 可以支持交叉网格风格的列表,类似于瀑布流或者Pinterest。
4:RecyclerView不支持直接在布局中添加分割线
5:RecyclerView不支持点击事件,没有addHeadView addFootView()只能用回调接口来设置点击事件
6:RecyclerView.ItemAnimator则被提供用于在RecyclerView添加、删除或移动item时处理动画效果。

ListView判断是否滑动到顶部

private boolean scrollFlag = false;// 标记是否滑动
private int lastVisibleItemPosition;// 标记上次滑动位置

listview.setOnScrollListener(new AbsListView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView absListView, int scrollState) {
            if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                scrollFlag = true;//滑动
            } else {
                scrollFlag = false;//没滑动
            }
        }
        @Override
        public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int 		totalItemCount) {

            if (scrollFlag) {
                if (firstVisibleItem > lastVisibleItemPosition) {
				//滑动后的第一个item > 标记上次滑动位置 (ps : 3>2)
                    Log.e(TAG, "上滑");
                }
                if (firstVisibleItem < lastVisibleItemPosition) {
                    Log.e(TAG, "下滑");
                }
                if (firstVisibleItem == lastVisibleItemPosition) {
                    return;
                }
                //滑动后位置
                lastVisibleItemPosition = firstVisibleItem;
            }
            if (firstVisibleItem == 0) {
                Log.e(TAG, "onScroll: 到达顶部");
            } else if (firstVisibleItem + visibleItemCount == totalItemCount) {
                Log.e(TAG, "onScroll: 到底底部");
            }

        }
    });

RecycleView 是否滑动到顶部和底部

newState: -1 顶部 0停止 1底部 2滚动

第一种

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
		//  静止 -> 被迫拖拽移动 -> 静止
		//     静止 -> 被迫拖拽移动 -> 自己滚动 -> 静止
            //   目前的状态 newState: 0 ,1,2
            // 0: 停止
            // 1:
            // 2: 自己滚动
            Log.e(TAG, "onScrollStateChanged: newState="+newState );
            boolean b =recyclerView.canScrollVertically(newState);
            Log.e(TAG, "onScrollStateChanged: b="+b );
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);				
			// dx : 水平滚动距离
			// dy : 垂直滚动距离
            // 1:  false : 滑动到底部
            //      true: 没滑动到底部
            if(recyclerView.canScrollVertically(1)){
                Log.e(TAG, "direction 1: true");
            }else {
                Log.e(TAG, "direction 1: false"+"滑动到底部");//

            }
            // -1:  false : 滑动到顶部
            //      true: 没滑动到顶部
            if(recyclerView.canScrollVertically(-1)){
                Log.e(TAG, "direction -1: true");
            }else {
                Log.e(TAG, "direction -1: false"+"滑动到顶部");//
            }
        }
    });

第二种:

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        Log.i(TAG, "--------------------------------------");
        LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        int firstCompletelyVisibleItemPosition = layoutManager.findFirstCompletelyVisibleItemPosition();
        Log.i(TAG, "firstCompletelyVisibleItemPosition: "+firstCompletelyVisibleItemPosition);
        if(firstCompletelyVisibleItemPosition==0)
            Log.i(TAG, "滑动到顶部");

        int lastCompletelyVisibleItemPosition = layoutManager.findLastCompletelyVisibleItemPosition();
        Log.i(TAG, "lastCompletelyVisibleItemPosition: "+lastCompletelyVisibleItemPosition);
        if(lastCompletelyVisibleItemPosition==layoutManager.getItemCount()-1)
            Log.i(TAG, "滑动到底部");
    }
});

你可能感兴趣的:(日常笔记)