ScrollView嵌套RecycleView解决高度不适配 94.64KB
tan6458需要积分:7(1积分=1元)资源文件列表:
RecycleViewForScrollView.rar 大约有76个文件
RecycleViewForScrollView\.gitignore 99B
RecycleViewForScrollView\app\.gitignore 8B
RecycleViewForScrollView\app\app.iml 1.28KB
RecycleViewForScrollView\app\build.gradle 381B
RecycleViewForScrollView\app\proguard-rules.pro 441B
RecycleViewForScrollView\app\src\androidTest\java\app\tdj\com\recycleview\ApplicationTest.java 227B
RecycleViewForScrollView\app\src\main\AndroidManifest.xml 367B
RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\activity\FullLinearLayout.java 962B
RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\activity\MainActivity.java 793B
RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\data\adapter\NoteAdapter.java 665B
RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\data\adapter\RecycleViewDivider.java 673B
RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\data\entity\Note.java 229B
RecycleViewForScrollView\app\src\main\res\layout\activity_main.xml 463B
RecycleViewForScrollView\app\src\main\res\layout\notes_item.xml 465B
RecycleViewForScrollView\app\src\main\res\menu\menu_main.xml 215B
RecycleViewForScrollView\app\src\main\res\mipmap-hdpi\ic_launcher.png 3.34KB
RecycleViewForScrollView\app\src\main\res\mipmap-mdpi\ic_launcher.png 2.15KB
RecycleViewForScrollView\app\src\main\res\mipmap-xhdpi\ic_launcher.png 4.73KB
RecycleViewForScrollView\app\src\main\res\mipmap-xxhdpi\ic_launcher.png 7.53KB
RecycleViewForScrollView\app\src\main\res\mipmap-xxxhdpi\ic_launcher.png 10.2KB
RecycleViewForScrollView\app\src\main\res\values\colors.xml 158B
RecycleViewForScrollView\app\src\main\res\values\dimens.xml 151B
RecycleViewForScrollView\app\src\main\res\values\strings.xml 95B
RecycleViewForScrollView\app\src\main\res\values\styles.xml 273B
RecycleViewForScrollView\app\src\main\res\values-v21\styles.xml 182B
RecycleViewForScrollView\app\src\main\res\values-w820dp\dimens.xml 271B
RecycleViewForScrollView\app\src\test\java\app\tdj\com\recycleview\ExampleUnitTest.java 241B
RecycleViewForScrollView\build.gradle 307B
RecycleViewForScrollView\gradle\wrapper\gradle-wrapper.jar 46.74KB
RecycleViewForScrollView\gradle\wrapper\gradle-wrapper.properties 166B
RecycleViewForScrollView\gradle.properties 514B
RecycleViewForScrollView\gradlew 1.87KB
RecycleViewForScrollView\gradlew.bat 984B
RecycleViewForScrollView\local.properties 328B
RecycleViewForScrollView\RecycleView.iml 457B
RecycleViewForScrollView\settings.gradle 16B
RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\data\adapter
RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\data\entity
RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\activity
RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview\data
RecycleViewForScrollView\app\src\androidTest\java\app\tdj\com\recycleview
RecycleViewForScrollView\app\src\main\java\app\tdj\com\recycleview
RecycleViewForScrollView\app\src\test\java\app\tdj\com\recycleview
RecycleViewForScrollView\app\src\androidTest\java\app\tdj\com
RecycleViewForScrollView\app\src\main\java\app\tdj\com
RecycleViewForScrollView\app\src\test\java\app\tdj\com
RecycleViewForScrollView\app\src\androidTest\java\app\tdj
RecycleViewForScrollView\app\src\main\java\app\tdj
RecycleViewForScrollView\app\src\test\java\app\tdj
RecycleViewForScrollView\app\src\androidTest\java\app
RecycleViewForScrollView\app\src\main\java\app
RecycleViewForScrollView\app\src\main\res\drawable
RecycleViewForScrollView\app\src\main\res\layout
RecycleViewForScrollView\app\src\main\res\menu
RecycleViewForScrollView\app\src\main\res\mipmap-hdpi
RecycleViewForScrollView\app\src\main\res\mipmap-mdpi
RecycleViewForScrollView\app\src\main\res\mipmap-xhdpi
RecycleViewForScrollView\app\src\main\res\mipmap-xxhdpi
RecycleViewForScrollView\app\src\main\res\mipmap-xxxhdpi
RecycleViewForScrollView\app\src\main\res\values
RecycleViewForScrollView\app\src\main\res\values-v21
RecycleViewForScrollView\app\src\main\res\values-w820dp
RecycleViewForScrollView\app\src\test\java\app
RecycleViewForScrollView\app\src\androidTest\java
RecycleViewForScrollView\app\src\main\java
RecycleViewForScrollView\app\src\main\res
RecycleViewForScrollView\app\src\test\java
RecycleViewForScrollView\app\src\androidTest
RecycleViewForScrollView\app\src\main
RecycleViewForScrollView\app\src\test
RecycleViewForScrollView\app\libs
RecycleViewForScrollView\app\src
RecycleViewForScrollView\gradle\wrapper
RecycleViewForScrollView\app
RecycleViewForScrollView\gradle
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);
}
}
相关资源