http://www.imooc.com/qadetail/91200 我在这个地址搜索到了,如何监听RecyclerView滑动到底的状态

而在实现完瀑布流后,觉得滑动到底部时,最后一行的高度,没有占满外部View,感觉不太好。(真正的瀑布流应该是条目数近乎无穷,可以一直加载更多)

既然是瀑布流,那么就选用StaggeredGridLayoutManager。
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)); //纵向3列

import android.content.Context;import android.support.annotation.Nullable;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.util.AttributeSet;import android.view.View;import android.view.ViewGroup;import java.util.Arrays;/** * 实现了滑动到底部的处理,暂未添加自定义监听器 * 实现了当LayoutManger是StaggeredGridLayoutManager时,滑到底部的那一行上的子view高度占满RecyclerView * * author : stone * email  : aa86799@163.com * time   : 16/5/6 14 23 */public class RichRecyclerView extends RecyclerView {    public RichRecyclerView(Context context) {        this(context, null);    }    public RichRecyclerView(Context context, @Nullable AttributeSet attrs) {        this(context, attrs, 0);    }    public RichRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);    }    @Override    protected void onMeasure(int widthSpec, int heightSpec) {        super.onMeasure(widthSpec, heightSpec);    }    @Override    public void onScrollStateChanged(int state) {        if (state == RecyclerView.SCROLL_STATE_IDLE) {            LayoutManager layoutManager = getLayoutManager();            if (layoutManager instanceof StaggeredGridLayoutManager) {                StaggeredGridLayoutManager lm = (StaggeredGridLayoutManager) layoutManager;//                int columnCount = lm.getColumnCountForAccessibility(null,null);//列数                int columnCount = lm.getSpanCount();//                System.out.println("----" +"columnCount" + columnCount);                int positions[] = new int[columnCount];                lm.findLastVisibleItemPositions(positions);//添加 可见的最后一行的 position 数据到数组 positions                System.out.println("----" +Arrays.toString(positions));                for (int i = 0; i < positions.length; i++) {//                    System.out.println("当前视图上的最后可见列的位置" + positions[i]);                }                for (int i = 0; i < positions.length; i++) {                    /**                     * 判断lastItem的底边到recyclerView顶部的距离                     * 是否小于recyclerView的高度                     * 如果小于或等于 说明滚动到了底部                     */                    if (positions[i] >= lm.getItemCount() - columnCount) {//                        System.out.println("滑动到底了1");//                        System.out.println("总adapter的条目数:" + lm.getItemCount()); //内部取的adapter的方法//                        System.out.println("总的列数:" + columnCount);//                        System.out.println("符号条件的最后可见列上的position" + positions[i]);                        View child = lm.findViewByPosition(positions[i]);                        ViewGroup.LayoutParams layoutParams = child.getLayoutParams();                        layoutParams.height = getHeight() - child.getBottom() + child.getHeight();                        child.setLayoutParams(layoutParams);                    }                }                int[] into = new int[columnCount];                lm.findFirstCompletelyVisibleItemPositions(into);                for (int i = 0; i < into.length; i++) {                    System.out.println("首次完全可见的view位置:" + into[i]);                }                lm.findFirstVisibleItemPositions(into);                for (int i = 0; i < into.length; i++) {                    System.out.println("首次可见的view位置(即使部份可见):" + into[i]);                }            } else if (layoutManager instanceof LinearLayoutManager){                LinearLayoutManager lm = (LinearLayoutManager) layoutManager;                int position = lm.findLastVisibleItemPosition();                if (position + 1 == lm.getItemCount()) {                    System.out.println("滑动到底了2");                }            }        }        super.onScrollStateChanged(state);    }}

相应的adapter:

/** * author : stone * email  : aa86799@163.com * time   : 16/4/9 16 22 */public class StaggeredAdapter extends BaseRecyclerViewAdapter<String> {    private List mWHs; //宽或高    private int mOrientation;    public StaggeredAdapter(Context context, int layoutID, List datas, int orientation) {        super(context, layoutID, datas);        this.mWHs = new ArrayList<>();        this.mOrientation = orientation;        for (int i = 0, len = datas.size(); i < len; i++) {            if (mOrientation == StaggeredGridLayoutManager.VERTICAL) {                mWHs.add((int) (100 + Math.random() * 100));            } else {                mWHs.add((int) (80 + Math.random() * 100));            }        }    }    @Override    public void onBindViewHolderSetData(@NonNull BaseRecyclerViewHolder holder, int position) {        holder.itemView.setBackgroundColor(getColor());        String str = getItem(position);        holder.setText(R.id.tv_text, str);        ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();        if (params == null) {            params = new ViewGroup.LayoutParams(-2, -2);        }        if (mOrientation == StaggeredGridLayoutManager.VERTICAL) {//            holder.itemView.setMinimumHeight(mWHs.get(position));//该方法改变itemview高度,并requestLayout(),子view没有重新请求layout            params.height = mWHs.get(position);        } else {//            holder.itemView.setMinimumWidth(mWHs.get(position));            params.width = mWHs.get(position);        }        holder.itemView.setLayoutParams(params);    }    /**     * 随机颜色     *     * @return     */    @CheckResult    private int getColor() {        StringBuilder sb = new StringBuilder();        Random random = new Random();        String temp;        for (int i = 0; i < 3; i++) {            temp = Integer.toHexString(random.nextInt(0xFF));            if (temp.length() == 1) {                temp = "0" + temp;            }            sb.append(temp);        }        return Color.parseColor("#" + sb.toString());    }}

item_adapter.xml:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@drawable/sel_item_back">    <TextView        android:id="@+id/tv_text"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:focusable="true"        android:focusableInTouchMode="true"        android:gravity="center"/>RelativeLayout>

更多相关文章

  1. android 获取屏幕高度,宽度,状态栏高度
  2. Android仿QQ主界面-------完善篇
  3. android Activity生命周期总结
  4. Android双向侧边滑动实现
  5. android 多分布率解决
  6. Android(安卓)UI基础——ViewPager+Fragment
  7. [置顶] 从源码角度分析Android(安卓)View的绘制机制(一)
  8. Android中ListView的使用及优化
  9. android scrollview嵌套listview出现高度显示不全解决方案

随机推荐

  1. Android的横竖屏切换
  2. Android Studio控件属性大全
  3. Android横竖屏总结
  4. Android编译过程详解(三)
  5. Android 单元测试之JUnit和Mockito
  6. ImageView下载图片加载
  7. Android4: 请放弃使用Theme.Dialog
  8. 在Android Studio中下载Android SDK的两
  9. android 背景边框变圆角
  10. 用EditText控件的属性inputType