首页下载资源移动开发ScrollView嵌套RecycleView解决高度不适配

RARScrollView嵌套RecycleView解决高度不适配

tan645894.64KB需要积分:1

资源文件列表:

RecycleViewForScrollView.rar 大约有76个文件
  1. RecycleViewForScrollView\.gitignore 99B
  2. RecycleViewForScrollView\app\.gitignore 8B
  3. RecycleViewForScrollView\app\app.iml 1.28KB
  4. RecycleViewForScrollView\app\build.gradle 381B
  5. RecycleViewForScrollView\app\proguard-rules.pro 441B
  6. RecycleViewForScrollView\app\src\androidTest\java\app\tdj\com\recycleview\ApplicationTest.java 227B
  7. RecycleViewForScrollView\app\src\main\AndroidManifest.xml 367B
  8. RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\activity\FullLinearLayout.java 962B
  9. RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\activity\MainActivity.java 793B
  10. RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\data\adapter\NoteAdapter.java 665B
  11. RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\data\adapter\RecycleViewDivider.java 673B
  12. RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\data\entity\Note.java 229B
  13. RecycleViewForScrollView\app\src\main\res\layout\activity_main.xml 463B
  14. RecycleViewForScrollView\app\src\main\res\layout\notes_item.xml 465B
  15. RecycleViewForScrollView\app\src\main\res\menu\menu_main.xml 215B
  16. RecycleViewForScrollView\app\src\main\res\mipmap-hdpi\ic_launcher.png 3.34KB
  17. RecycleViewForScrollView\app\src\main\res\mipmap-mdpi\ic_launcher.png 2.15KB
  18. RecycleViewForScrollView\app\src\main\res\mipmap-xhdpi\ic_launcher.png 4.73KB
  19. RecycleViewForScrollView\app\src\main\res\mipmap-xxhdpi\ic_launcher.png 7.53KB
  20. RecycleViewForScrollView\app\src\main\res\mipmap-xxxhdpi\ic_launcher.png 10.2KB
  21. RecycleViewForScrollView\app\src\main\res\values\colors.xml 158B
  22. RecycleViewForScrollView\app\src\main\res\values\dimens.xml 151B
  23. RecycleViewForScrollView\app\src\main\res\values\strings.xml 95B
  24. RecycleViewForScrollView\app\src\main\res\values\styles.xml 273B
  25. RecycleViewForScrollView\app\src\main\res\values-v21\styles.xml 182B
  26. RecycleViewForScrollView\app\src\main\res\values-w820dp\dimens.xml 271B
  27. RecycleViewForScrollView\app\src\test\java\app\tdj\com\recycleview\ExampleUnitTest.java 241B
  28. RecycleViewForScrollView\build.gradle 307B
  29. RecycleViewForScrollView\gradle\wrapper\gradle-wrapper.jar 46.74KB
  30. RecycleViewForScrollView\gradle\wrapper\gradle-wrapper.properties 166B
  31. RecycleViewForScrollView\gradle.properties 514B
  32. RecycleViewForScrollView\gradlew 1.87KB
  33. RecycleViewForScrollView\gradlew.bat 984B
  34. RecycleViewForScrollView\local.properties 328B
  35. RecycleViewForScrollView\RecycleView.iml 457B
  36. RecycleViewForScrollView\settings.gradle 16B
  37. RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\data\adapter
  38. RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\data\entity
  39. RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\activity
  40. RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\data
  41. RecycleViewForScrollView\app\src\androidTest\java\app\tdj\com\recycleview
  42. RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview
  43. RecycleViewForScrollView\app\src\test\java\app\tdj\com\recycleview
  44. RecycleViewForScrollView\app\src\androidTest\java\app\tdj\com
  45. RecycleViewForScrollView\app\src\main\java\app\tdj\com
  46. RecycleViewForScrollView\app\src\test\java\app\tdj\com
  47. RecycleViewForScrollView\app\src\androidTest\java\app\tdj
  48. RecycleViewForScrollView\app\src\main\java\app\tdj
  49. RecycleViewForScrollView\app\src\test\java\app\tdj
  50. RecycleViewForScrollView\app\src\androidTest\java\app
  51. RecycleViewForScrollView\app\src\main\java\app
  52. RecycleViewForScrollView\app\src\main\res\drawable
  53. RecycleViewForScrollView\app\src\main\res\layout
  54. RecycleViewForScrollView\app\src\main\res\menu
  55. RecycleViewForScrollView\app\src\main\res\mipmap-hdpi
  56. RecycleViewForScrollView\app\src\main\res\mipmap-mdpi
  57. RecycleViewForScrollView\app\src\main\res\mipmap-xhdpi
  58. RecycleViewForScrollView\app\src\main\res\mipmap-xxhdpi
  59. RecycleViewForScrollView\app\src\main\res\mipmap-xxxhdpi
  60. RecycleViewForScrollView\app\src\main\res\values
  61. RecycleViewForScrollView\app\src\main\res\values-v21
  62. RecycleViewForScrollView\app\src\main\res\values-w820dp
  63. RecycleViewForScrollView\app\src\test\java\app
  64. RecycleViewForScrollView\app\src\androidTest\java
  65. RecycleViewForScrollView\app\src\main\java
  66. RecycleViewForScrollView\app\src\main\res
  67. RecycleViewForScrollView\app\src\test\java
  68. RecycleViewForScrollView\app\src\androidTest
  69. RecycleViewForScrollView\app\src\main
  70. RecycleViewForScrollView\app\src\test
  71. RecycleViewForScrollView\app\libs
  72. RecycleViewForScrollView\app\src
  73. RecycleViewForScrollView\gradle\wrapper
  74. RecycleViewForScrollView\app
  75. RecycleViewForScrollView\gradle
  76. RecycleViewForScrollView

资源介绍:

在Android开发中,ScrollView通常用于实现可滚动的内容视图,而RecyclerView则是一个高效的数据列表视图,能够自动管理并重用列表项。然而,当ScrollView嵌套RecyclerView时,可能会遇到一些常见问题,如RecycleView的高度不适配导致无法正确显示,或是滑动体验不佳。这些问题的出现主要是由于两者的滚动机制冲突以及默认布局管理器的设置。 我们需要理解为什么会出现高度不适配的问题。ScrollView默认期望其子视图完全填充其内容,而RecyclerView则是动态加载和复用其视图,这导致ScrollView无法准确计算RecyclerView的高度,可能将其视为零高度,因此RecycleView内容无法显示。为了解决这个问题,我们可以采用以下策略: 1. **设置RecyclerView的布局管理器**:使用LinearLayoutManager并设置orientation为垂直,这样可以确保RecyclerView的总高度是可计算的,从而适应ScrollView。 ```java RecyclerView recyclerView = findViewById(R.id.recycler_view); LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager); ``` 2. **设置RecyclerView的固定高度**:如果RecyclerView的内容高度是固定的,可以直接设置一个固定高度。但这不是最佳实践,因为它限制了RecyclerView的灵活性。 3. **自定义ScrollView**:创建一个自定义的ScrollView,重写onMeasure方法,使其能够正确测量并适应RecyclerView的高度。 ```java public class NestedScrollView extends ScrollView { public NestedScrollView(Context context) { super(context); } public NestedScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public NestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int heightMeasureSpecCustom = MeasureSpec.makeMeasureSpec( MeasureSpec.UNSPECIFIED, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpecCustom); ViewGroup.LayoutParams lp = getLayoutParams(); lp.height = getMeasuredHeight(); } } ``` 4. **使用NestedScrollView替代ScrollView**:NestedScrollView是专门为处理嵌套滚动设计的,它能更好地处理内部滚动视图的交互。将ScrollView替换为NestedScrollView,并确保在RecyclerView上启用nestedScrolling。 ```java RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setNestedScrollingEnabled(true); ``` 5. **使用CardView或其它容器**:将RecyclerView包裹在一个具有固定高度的容器(如CardView)中,可以解决高度适配问题,但可能会影响滚动性能。 6. **优化滚动行为**:通过设置`android:nestedScrollingEnabled="true"`属性,使RecyclerView能够处理自身的滚动事件,避免与ScrollView的滚动冲突。 ```xml ``` 以上就是解决ScrollView嵌套RecyclerView高度不适配和滑动不顺畅问题的一些常见方法。在实际开发中,应根据项目需求和性能考虑选择最合适的方法。同时,注意优化数据加载和渲染,避免因大量数据加载导致的卡顿,提升用户体验。
package app.tdj.com.recycleview.activity; import android.content.Context; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; public class FullLinearLayout extends LinearLayoutManager { private int[] mMeasuredDimension = new int[2]; int dividerHeight = 1; @SuppressWarnings("UnusedDeclaration") public FullLinearLayout(Context context, int dividerHeight) { super(context); this.dividerHeight = dividerHeight; } @SuppressWarnings("UnusedDeclaration") public FullLinearLayout(Context context, int orientation, boolean reverseLayout) { super(context, orientation, reverseLayout); } @Override public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) { final int widthMode = View.MeasureSpec.getMode(widthSpec); final int heightMode = View.MeasureSpec.getMode(heightSpec); final int heightSize = View.MeasureSpec.getSize(heightSpec); int width = 0; int height = 0; for (int i = 0; i < getItemCount(); i++) { try { measureScrapChild(recycler, i, widthSpec, View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), mMeasuredDimension); } catch (IndexOutOfBoundsException e) { e.printStackTrace(); } if (getOrientation() == HORIZONTAL) { width = width + mMeasuredDimension[0]; if (i == 0) { height = mMeasuredDimension[1]; } } else { height = height + mMeasuredDimension[1] + dividerHeight; if (i == 0) { width = mMeasuredDimension[0]; } } } switch (widthMode) { case View.MeasureSpec.EXACTLY: case View.MeasureSpec.AT_MOST: case View.MeasureSpec.UNSPECIFIED: } switch (heightMode) { case View.MeasureSpec.EXACTLY: height = heightSize; case View.MeasureSpec.AT_MOST: case View.MeasureSpec.UNSPECIFIED: } setMeasuredDimension(widthSpec, height); } private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, int[] measuredDimension) { View view = recycler.getViewForPosition(position); if (view != null) { RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams(); int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec, getPaddingTop() + getPaddingBottom(), p.height); view.measure(widthSpec, childHeightSpec); measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin; measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin; recycler.recycleView(view); } } @Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { super.onLayoutChildren(recycler, state); } }
100+评论
captcha