NestedScrollView和RecyclerView使用,并设置间距:

效果图如下:



1.NestedScrollView 和RecyclerView嵌套问题(类似ScrollView 和listView)\

需重写 RecyclerView 的 GridLayoutManager(还有另外2种,随便搜下就有)

  1. public class FullyGridLayoutManager extends GridLayoutManager {
  2. public FullyGridLayoutManager(Context context, int spanCount) {
  3. super(context, spanCount);
  4. }
  5. public FullyGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) {
  6. super(context, spanCount, orientation, reverseLayout);
  7. }
  8. private int[] mMeasuredDimension = new int[2];
  9. @Override
  10. public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {
  11. final int widthMode = View.MeasureSpec.getMode(widthSpec);
  12. final int heightMode = View.MeasureSpec.getMode(heightSpec);
  13. final int widthSize = View.MeasureSpec.getSize(widthSpec);
  14. final int heightSize = View.MeasureSpec.getSize(heightSpec);
  15. int width = 0;
  16. int height = 0;
  17. int count = getItemCount();
  18. int span = getSpanCount();
  19. for (int i = 0; i < count; i++) {
  20. measureScrapChild(recycler, i,
  21. View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
  22. View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
  23. mMeasuredDimension);
  24. if (getOrientation() == HORIZONTAL) {
  25. if (i % span == 0) {
  26. width = width + mMeasuredDimension[0];
  27. }
  28. if (i == 0) {
  29. height = mMeasuredDimension[1];
  30. }
  31. } else {
  32. if (i % span == 0) {
  33. height = height + mMeasuredDimension[1];
  34. }
  35. if (i == 0) {
  36. width = mMeasuredDimension[0];
  37. }
  38. }
  39. }
  40. switch (widthMode) {
  41. case View.MeasureSpec.EXACTLY:
  42. width = widthSize;
  43. case View.MeasureSpec.AT_MOST:
  44. case View.MeasureSpec.UNSPECIFIED:
  45. }
  46. switch (heightMode) {
  47. case View.MeasureSpec.EXACTLY:
  48. height = heightSize;
  49. case View.MeasureSpec.AT_MOST:
  50. case View.MeasureSpec.UNSPECIFIED:
  51. }
  52. setMeasuredDimension(width, height);
  53. }
  54. private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
  55. int heightSpec, int[] measuredDimension) {
  56. if (position < getItemCount()) {
  57. try {
  58. View view = recycler.getViewForPosition(0);//fix 动态添加时报IndexOutOfBoundsException
  59. if (view != null) {
  60. RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
  61. int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,
  62. getPaddingLeft() + getPaddingRight(), p.width);
  63. int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
  64. getPaddingTop() + getPaddingBottom(), p.height);
  65. view.measure(childWidthSpec, childHeightSpec);
  66. measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;
  67. measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;
  68. recycler.recycleView(view);
  69. }
  70. } catch (Exception e) {
  71. e.printStackTrace();
  72. }
  73. }
  74. }
  75. }

重写NestedScrollView,实际上是NestedScrollView禁止滑动

  1. public class MyNestedScrollView extends NestedScrollView {
  2. private int downX;
  3. private int downY;
  4. private int mTouchSlop;
  5. public MyNestedScrollView(Context context) {
  6. super(context);
  7. mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
  8. }
  9. public MyNestedScrollView(Context context, AttributeSet attrs) {
  10. super(context, attrs);
  11. mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
  12. }
  13. public MyNestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
  14. super(context, attrs, defStyleAttr);
  15. mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
  16. }
  17. @Override
  18. public boolean onInterceptTouchEvent(MotionEvent e) {
  19. int action = e.getAction();
  20. switch (action) {
  21. case MotionEvent.ACTION_DOWN:
  22. downX = (int) e.getRawX();
  23. downY = (int) e.getRawY();
  24. break;
  25. case MotionEvent.ACTION_MOVE:
  26. int moveY = (int) e.getRawY();
  27. if (Math.abs(moveY - downY) > mTouchSlop) {
  28. return true;
  29. }
  30. }
  31. return super.onInterceptTouchEvent(e);
  32. }
  33. }

让recyclerView滑动

“`java

recyclerView.setNestedScrollingEnabled(false);

“`

给recyclerView创建Adapter

  1. public class DemoAdapter extends RecyclerView.Adapter<DemoViewHolder> {
  2. private ArrayList<String> list;
  3. public Context mContext;
  4. public DemoAdapter(Context mContext) {
  5. this.mContext=mContext;
  6. }
  7. @Override
  8. public DemoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  9. View mView = LayoutInflater.from(mContext).inflate(R.layout.item_viewholder, parent, false);
  10. DemoViewHolder mViewHolder = new DemoViewHolder(mView);
  11. return mViewHolder;
  12. }
  13. @Override
  14. public void onBindViewHolder(DemoViewHolder holder, int position) {
  15. Glide.with(mContext).load("http://img.nongshanghang.cn/allimg/160906/22435210b_1.jpg").into( holder.imageView);
  16. }
  17. @Override
  18. public int getItemCount() {
  19. return 9;
  20. }
  21. }

Viewholder 部分

  1. public class DemoViewHolder extends RecyclerView.ViewHolder {
  2. public DemoViewHolder(View itemView) {
  3. super(itemView);
  4. imageView=(ImageView)itemView.findViewById(R.id.imageview);
  5. }
  6. public ImageView imageView;
  7. }

设置RecyclerView 的item间距

  1. public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
  2. private int left;
  3. private int right;
  4. private int top;
  5. private int bottom;
  6. public SpacesItemDecoration(int space) {
  7. this.left=space;
  8. this.right=space;
  9. this.top=space;
  10. this.bottom=space;
  11. }
  12. public SpacesItemDecoration(int left,int right,int top,int bottom) {
  13. this.left=left;
  14. this.right=right;
  15. this.top=top;
  16. this.bottom=bottom;
  17. }
  18. @Override
  19. public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
  20. outRect.left=left;
  21. outRect.right=right;
  22. outRect.bottom=bottom;
  23. outRect.top=top;
  24. }
  25. }

最后设置

  1. recyclerView=(RecyclerView)findViewById(R.id.recyclerview);
  2. recyclerView.setNestedScrollingEnabled(false);
  3. layoutManager=new FullyGridLayoutManager(this,3,GridLayoutManager.VERTICAL,false);
  4. adpater=new DemoAdapter(this);
  5. recyclerView.setAdapter(adpater);
  6. recyclerView.setLayoutManager(layoutManager);
  7. SpacesItemDecoration decoration;
  8. // if (Integer.parseInt(android.os.Build.VERSION.SDK) >= 19) {
  9. // decoration = new SpacesItemDecoration(ScreenUtils.dipToPx(getActivity(), 4), ScreenUtils.dipToPx(getActivity(), 4), ScreenUtils.dipToPx(getActivity(), 0), ScreenUtils.dipToPx(getActivity(), 8));
  10. // }else{
  11. decoration = new SpacesItemDecoration(4, 4, 4,4);
  12. // }
  13. recyclerView.addItemDecoration(decoration);
  14. adpater.notifyDataSetChanged();

代码并不难,希望通过我这个例子,一是巩固自己的学习和理解,二是希望更多的人更好的学习,我会再接再厉,写更多的博文。

源码下载

csdn博客

NestedScrollView和RecyclerView使用,并设置间距的更多相关文章

  1. 使用NestedScrollView+ViewPager+RecyclerView+SmartRefreshLayout打造酷炫下拉视差效果并解决各种滑动冲突

    使用NestedScrollView+ViewPager+RecyclerView+SmartRefreshLayout打造酷炫下拉视差效果并解决各种冲突 如果你还在为处理滑动冲突而发愁,那么你需要静 ...

  2. NestedScrollView嵌套RecyclerView

    天气渐寒,然学习不可懈怠,记录一下使用NestedScrollView嵌套RecyclerView的两个问题,以后遇到可以来这里温故. 应该说在MD中,RecyclerView代替了ListView, ...

  3. Android NestedScrollView与RecyclerView嵌套,以及NestedScrollView不会滚动到屏幕顶部解决

    ①NestedScrollView与RecyclerView嵌套,导致滚动惯性消失 解决:mRecyclerView.setNestedScrollingEnabled(false); ②Nested ...

  4. Android 使用NestedScrollView+ViewPager+RecyclerView+SmartRefreshLayout打造酷炫下拉视差效果并解决各种滑动冲突

    如果你还在为处理滑动冲突而发愁,那么你需要静下心来看看这边文章,如果你能彻底理解这篇文章中使用的技术,那么,一切滑动冲突的问题解决起来就轻而易举了: 先扔一个最终实现的效果图 先分析下效果图中实现的功 ...

  5. UICollectionViewCell的设置间距

    UICollectionViewCell的设置间距 #pragma mark - UICollectionView 大小(宽高,平均一行三个) - (CGSize)collectionView:(UI ...

  6. Android 开发 RecyclerView设置间距

    实现步骤 首先要创建一个类继承RecyclerView.ItemDecoration 然后重新这个类的getItemOffsets方法,删除方法里的super.getItemOffsets(outRe ...

  7. Recyclerview设置间距

    首先自定义一个RecyclerViewDivider 继承 RecyclerView.ItemDecoration,实现自定义. public class RecyclerViewDivider ex ...

  8. Android 解决NestedScrollView 嵌套 RecyclerView出现的卡顿,上拉刷新无效

    解决卡顿的方法最简单的就是设置RecyclerView的android:nestedScrollingEnabled="false",放弃自己的滑动,交给外部的NestedScro ...

  9. 动态为TextView控件设置drawableLeft图标,并设置间距

    效果图: 重要属性: textView.setCompoundDrawablePadding(4);//设置图片和text之间的间距 textView.setPadding(-5, 0, 0, 0); ...

随机推荐

  1. nginx 访问路径配置

    比如: http://127.0.0.1/ 对应的物理路径 c:/a/b/c 比如:http://127.0.0.1/eec 访问的地址对应的物理路径: d:/a/b/c #user nobody; ...

  2. static 和 final 和 static final

    众所周知,static 是静态修饰关键字:可以修饰变量,程序块,方法,类. 1.修饰变量. 得知:如果static修饰的是变量,则JVM会将将其分配在内存堆上,该变量就与对象无关,所有对该变量的引用都 ...

  3. springboot 整合redisson

    整合代码已经过测试 1.pom <!-- redisson --> <dependency> <groupId>org.redisson</groupId&g ...

  4. ICSharpCode.SharpZipLi 压缩、解压文件 附源码

    http://www.icsharpcode.net/opensource/sharpziplib/ 有SharpZiplib的最新版本,本文使用的版本为0.86.0.518,支持Zip, GZip, ...

  5. 基于JQUERY 的图片查看插件

    viewer是一款功能强大的图片查看器.它可以实现ACDsee等看图软件的部分功能.它可以对图片进行移动,缩放,旋转,翻转,可以前后浏览一组图片.该图片查看器还支持移动设备,支持键盘控制,功能十分强大 ...

  6. Visual Studio 要求导入 pfx 密钥以及导入后依然要求导入的解决办法

    本文为个人博客备份文章,原文地址: http://validvoid.net/visual-studio-pfx-import/ 导入密钥 在使用 Visual Studio 生产项目时,使用 pfx ...

  7. 连接字符串(web.config)

    data source=ip; initial catalog=db1; user id=sa; password=*** <connectionStrings> <add name ...

  8. c#获取目录2

    // 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnostics.Process.G ...

  9. NIM(1) 一排石头的游戏

    最近在实习面试过程中,一个朋友遇到了该问题,从简单到复杂的思路如下,希望能给遇到相同问题的朋友一些启发和帮助.(内容来源网络和<编程之美>) 1.问题1 100个苹果 桌上有100个苹果, ...

  10. Python函数(1)

    一.Python函数介绍 函数时组织好的,可重复的,用来实现单一,或相关联功能的代码段. 函数的使用原则时先定义,后调用:事先准备工具的过程即函数的定义,遇到应用场景拿来当工具用即函数的调用. 函数的 ...