Android(安卓)RecyclerView 实现瀑布流交错效果,并使最后一行子View高度占满RecyclerView
16lz
2022-04-28
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>
更多相关文章
- android 获取屏幕高度,宽度,状态栏高度
- Android仿QQ主界面-------完善篇
- android Activity生命周期总结
- Android双向侧边滑动实现
- android 多分布率解决
- Android(安卓)UI基础——ViewPager+Fragment
- [置顶] 从源码角度分析Android(安卓)View的绘制机制(一)
- Android中ListView的使用及优化
- android scrollview嵌套listview出现高度显示不全解决方案