RecycleView的滑动冲突问题,item间距问题,分页加载,快速回到顶部问题

来源:互联网 发布:it会议 编辑:程序博客网 时间:2024/05/22 04:48

    • 需求分析
    • RecycleView滑动冲突问题
    • RecycleView混排模块实现整个页面布局的思路
    • RecycleView快速回到顶部
    • 添加item分割线或者间距的类

需求分析

一个页面的首页顶部是轮播图,下边有几个固定控件,最后是一个商品列表,可以分页加载,类似下图这种效果
这里写图片描述
现在整个页面除了标题栏就用一个RecycleView实现,不再用scrollView嵌套recycleview

1.RecycleView滑动冲突问题

只用RecycleView那就不存在滑动冲突问题,这就要用到RecycleView的两个方法,addHeaderView和addFootView,思路

2.RecycleView混排模块实现整个页面布局的思路

1.将上图中的方框中的模块布局从页面跟布局中抽离出来,单独写成xml文件,

这里写图片描述

2,页面的根布局只保留RecycleView和标题栏
这里写图片描述
实现越界回弹的那个上篇文章已经说过了
3,使用RecycleView的addHeaderView将抽离出来的布局加到recycleview整体布局上边,修改定位控件的操作

   view= LayoutInflater.from(this).inflate(R.layout.shopmall_topview,null);        view_foot= LayoutInflater.from(this).inflate(R.layout.footview,null);        tv_loadingmore= (TextView) view_foot.findViewById(R.id.tv_loadingmore);        ll_duihuan= (LinearLayout) view.findViewById(R.id.ll_duihuan);        ll_zhekou= (LinearLayout) view.findViewById(R.id.ll_zhekou);        ll_freeduihuan= (LinearLayout) view.findViewById(R.id.ll_freeduihuan);        ll_signgift= (LinearLayout) view.findViewById(R.id.ll_signgift);        ll_lotto= (LinearLayout) view.findViewById(R.id.ll_lotto);        ll_share= (LinearLayout) view.findViewById(R.id.ll_share);        ll_register= (LinearLayout) view.findViewById(R.id.ll_register);

RecycleView的滑动监听和item点击事件处理分页加载

  recycleview.addOnScrollListener(new RecyclerView.OnScrollListener() {            @Override            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {                super.onScrollStateChanged(recyclerView, newState);                LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();                int firstVisibleItemPosition = manager.findFirstVisibleItemPosition();                // 当不滚动时                if (newState == RecyclerView.SCROLL_STATE_IDLE) {                    // 判断是否滚动超过一屏                    if (firstVisibleItemPosition == 0) {                        IB_top.setVisibility(View.GONE);                    } else {                        IB_top.setVisibility(View.VISIBLE);                        page ++;                        if (page<=totalPageCount){                            show_ZhuanQuMessage(0,0,page);                        }                    }                } else if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {//拖动中                    IB_top.setVisibility(View.GONE);                }            }            @Override            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {                super.onScrolled(recyclerView, dx, dy);            }        });        recycleview.addOnItemTouchListener(new OnItemChildClickListener() {            @Override            public void onSimpleItemChildClick(BaseQuickAdapter adapter, View view, int position) {            }            @Override            public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {                super.onItemChildClick(adapter, view, position);                int itemViewId = view.getId();                mapItem=list_hot.get(position);                imageViewLove= (ImageView) view.findViewById(R.id.iv_love);                switch (itemViewId) {                    case R.id.iv_shopImgitem:                        ///site/detail?IntegralmallrelationId=678&productid=37861//                        String imgURL= (String) mapItem.get("SrcAbsolute");                        DecimalFormat df=new DecimalFormat("#####0");//四舍五入取整IntegralmallrelationId                        Double i= (Double) mapItem.get("IntegralmallrelationId");                        Double j= (Double) mapItem.get("ProductID");

RecycleView快速回到顶部

 recycleview.smoothScrollToPosition(0);

添加item分割线或者间距的类

package com.lab.web.entity;import android.graphics.Rect;import android.support.v7.widget.RecyclerView;import android.view.View;/** * 设置RecycleView的item间距的类 * Created by ytf on 2017/10/24. */public class SpacesItemDecoration extends RecyclerView.ItemDecoration {    private int spanCount;    private int spacing;    private boolean includeEdge;    public SpacesItemDecoration(int spanCount, int spacing, boolean includeEdge) {        this.spanCount = spanCount;        this.spacing = spacing;        this.includeEdge = includeEdge;    }    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        int position = parent.getChildAdapterPosition(view); // item position        int column = position % spanCount; // item column        if (includeEdge) {            outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing)            outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing)            if (position < spanCount) { // top edge                outRect.top = spacing;            }            outRect.bottom = spacing; // item bottom        } else {            outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing)            outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f /    spanCount) * spacing)            if (position >= spanCount) {                outRect.top = spacing; // item top            }        }    }}

GridView样式使用:
recycleview.addItemDecoration(new SpacesItemDecoration(1, 15, true));
//跨度,四周间距25px,包含边距
listview样式的类:

public class SpacesItemDecoration extends RecyclerView.ItemDecoration {    private int space;    public SpacesItemDecoration(int space) {        this.space=space;    }    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        outRect.left=space;        outRect.right=space;        outRect.bottom=space;        if(parent.getChildAdapterPosition(view)==0){            outRect.top=space;        }    }}

linerlayoutmanger使用:

SpacesItemDecoration decoration=new SpacesItemDecoration(16);recyclerView.addItemDecoration(decoration);