RecyclerView 实现瀑布流交错效果,并使最后一行子View高度占满RecyclerView
2016-06-15 17:29
555 查看
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<Integer> mWHs; //宽或高 private int mOrientation; public StaggeredAdapter(Context context, int layoutID, List<String> 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>
相关文章推荐
- SQLite插入多条语句很慢
- CentOS系统下使用maven编译javaCPP-ffmpeg
- Android Button的Text如果是英文,不管大小写默认都会变成大写,改成原样输出
- eclispe java 自动生成Junit测试类
- Wireshark入门与进阶系列(一)
- NEUOJ711 异星工厂 字典树+贪心
- mybatis和hibernate创建会话的简单区别
- appium自动测试化相关
- 【ReactNative】undefined is not an object(evaluating 'this.props.navigator')
- K3 指定现金流量提示"现金流量项目本位币金额之和不等于科目余额"
- swift单例的创建与使用
- ImportError: No module named matplotlib
- AStar算法的学习
- android studio 如何调用自定义的framework.jar包在andorid.jar包之前呢
- 14.3.2.3 Consistent Nonlocking Reads 一致性非锁定读
- 回调方法介绍之中国好室友篇(Java示例)
- ViewPager
- 定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
- java中的一些执行顺序,代码块,静态,构造,成员。。。。(转的)
- 嵌入式C开发---用循环实现左移右移