在具有灵活 Recycler 项目高度的 ScrollView 中使用 RecyclerView
Use RecyclerView inside ScrollView with flexible Recycler item height
我想知道有没有什么方法可以使用RecyclerView?
在此之前,我在 ScrollView 中使用 固定高度 的 RecyclerView 但是这次我不知道项目的高度.
提示:在问这个问题之前,我阅读了堆栈问题上的所有问题和解决方案。
更新:
一些解决方案显示了如何单独滚动 RecyclerView,但我想显示它展开。
如果为 RecyclerView 设置固定高度对某些人(比如我)不起作用,这是我添加到固定高度解决方案中的内容:
mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
int action = e.getAction();
switch (action) {
case MotionEvent.ACTION_MOVE:
rv.getParent().requestDisallowInterceptTouchEvent(true);
break;
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
});
我
我在全世界搜索这个问题的答案,但我没有找到这个热门问题的任何直接答案。最后我混合了一些技巧并解决了这个问题!
当我的老板要求我在 ScrollView 中使用 RecyclerView 时,我的问题就开始了,正如你所知,我们不能使用两个 可滚动 对象在彼此内部,除非我们为我们的 RecyclerView 设置或知道 固定项目高度。这就是答案:
第 1 步:
首先你应该找到你的 RecyclerView 灵活的项目高度,这可以从你的 RecyclerView>onBindViewHolder
holder.itemView.post(new Runnable() {
@Override
public void run() {
int cellWidth = holder.itemView.getWidth();// this will give you cell width dynamically
int cellHeight = holder.itemView.getHeight();// this will give you cell height dynamically
dynamicHeight.HeightChange(position, cellHeight); //call your iterface hear
}
});
使用此代码,您可以在构建时找到您的项目高度,并使用 接口 将项目高度发送到您的 activity。
对于界面有问题的朋友,我在下面留下界面代码,应该写在Adapter中。
public interface DynamicHeight {
void HeightChange (int position, int height);
}
第 2 步:
到目前为止我们找到了我们的项目高度,现在我们想为我们的 RecyclerView 设置高度。首先我们应该计算项目高度的总和。在这一步中,我们通过 BitMap
首先 实现 最后一步 接口 并在下面的 Activity 或 Fragment 定义了你的 RecyclerView:
@Override
public void HeightChange(int position, int height) {
itemHeight.put(position, height);
sumHeight = SumHashItem (itemHeight);
float density = activity.getResources().getDisplayMetrics().density;
float viewHeight = sumHeight * density;
review_recyclerView.getLayoutParams().height = (int) sumHeight;
int i = review_recyclerView.getLayoutParams().height;
}
int SumHashItem (HashMap<Integer, Integer> hashMap) {
int sum = 0;
for(Map.Entry<Integer, Integer> myItem: hashMap.entrySet()) {
sum += myItem.getValue();
}
return sum;
}
第 3 步:
现在我们有了您的 RecyclerView 高度的总和。对于最后一步,我们应该使用如下代码将我们在上一步中编写的接口发送到适配器:
reviewRecyclerAdapter = new ReviewRecyclerAdapter(activity, reviewList, review_recyclerView, this);
当你实现接口时,你应该将它与我使用的上下文一起发送给你 this.
尽情享受
我完全同意 Ashkan 的解决方案,非常感谢(投票 +1!),但有一件事...
如果 RecyclerView 确实在 ScrollView/NestedScrollView 内正确滚动,但它没有抛出(拦截它),那么解决方案是扩展 RecyclerView 并覆盖 OnInterceptTouchEvent 和 OnTouchEvent。如果您不需要任何点击操作,而只是想展示具有工作效果的项目,那么只需 return false 如下所示:
public class InterceptingRecyclerView extends RecyclerView {
public InterceptingRecyclerView(Context context) {
super(context);
}
public InterceptingRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public InterceptingRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
return false;
}
@Override
public boolean onTouchEvent(MotionEvent e) {
return false;
}
}
或者实际上它应该被称为 NonIntercepting... ;) 就这么简单。
[已解决] 我对 Horizontal recycleview 有同样的问题。
为 recycleview
更改 Gradle 回购
compile 'com.android.support:recyclerview-v7:23.2.1'
这样写:linearLayoutManager.setAutoMeasureEnabled(true);
修复了更新中与各种测量规范方法相关的错误
勾选http://developer.android.com/intl/es/tools/support-library/features.html#v7-recyclerview
我发现 23.2.1 库有问题:
当项目是 match_parent 回收视图填充完整项目以查看,请始终使用 min height or "wrap_content".
谢谢
要修复 RecyclerView
中的 fling,您必须覆盖 LinearLayoutManager
中的 canScrollVertically
:
linearLayoutManager = new LinearLayoutManager(context) {
@Override
public boolean canScrollVertically() {
return false;
}
};
如果你只想滚动,那么你可以使用 NestedScrollView 而不是 ScrollView因此,您可以使用以下内容修改代码:
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
//design your content here with RecyclerView
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
将此行用于您的回收站视图:
android:nestedScrollingEnabled="false"
试一试,recyclerview 会平滑滚动,高度灵活
我使用 NestedScrollView
而不是 ScrollView
解决了这个问题。
对于RecyclerView
:
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
在代码中
recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(false);
我想知道有没有什么方法可以使用RecyclerView?
在此之前,我在 ScrollView 中使用 固定高度 的 RecyclerView 但是这次我不知道项目的高度.
提示:在问这个问题之前,我阅读了堆栈问题上的所有问题和解决方案。
更新: 一些解决方案显示了如何单独滚动 RecyclerView,但我想显示它展开。
如果为 RecyclerView 设置固定高度对某些人(比如我)不起作用,这是我添加到固定高度解决方案中的内容:
mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
int action = e.getAction();
switch (action) {
case MotionEvent.ACTION_MOVE:
rv.getParent().requestDisallowInterceptTouchEvent(true);
break;
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
});
我
我在全世界搜索这个问题的答案,但我没有找到这个热门问题的任何直接答案。最后我混合了一些技巧并解决了这个问题!
当我的老板要求我在 ScrollView 中使用 RecyclerView 时,我的问题就开始了,正如你所知,我们不能使用两个 可滚动 对象在彼此内部,除非我们为我们的 RecyclerView 设置或知道 固定项目高度。这就是答案:
第 1 步: 首先你应该找到你的 RecyclerView 灵活的项目高度,这可以从你的 RecyclerView>onBindViewHolder
holder.itemView.post(new Runnable() {
@Override
public void run() {
int cellWidth = holder.itemView.getWidth();// this will give you cell width dynamically
int cellHeight = holder.itemView.getHeight();// this will give you cell height dynamically
dynamicHeight.HeightChange(position, cellHeight); //call your iterface hear
}
});
使用此代码,您可以在构建时找到您的项目高度,并使用 接口 将项目高度发送到您的 activity。
对于界面有问题的朋友,我在下面留下界面代码,应该写在Adapter中。
public interface DynamicHeight {
void HeightChange (int position, int height);
}
第 2 步: 到目前为止我们找到了我们的项目高度,现在我们想为我们的 RecyclerView 设置高度。首先我们应该计算项目高度的总和。在这一步中,我们通过 BitMap 首先 实现 最后一步 接口 并在下面的 Activity 或 Fragment 定义了你的 RecyclerView:
@Override
public void HeightChange(int position, int height) {
itemHeight.put(position, height);
sumHeight = SumHashItem (itemHeight);
float density = activity.getResources().getDisplayMetrics().density;
float viewHeight = sumHeight * density;
review_recyclerView.getLayoutParams().height = (int) sumHeight;
int i = review_recyclerView.getLayoutParams().height;
}
int SumHashItem (HashMap<Integer, Integer> hashMap) {
int sum = 0;
for(Map.Entry<Integer, Integer> myItem: hashMap.entrySet()) {
sum += myItem.getValue();
}
return sum;
}
第 3 步: 现在我们有了您的 RecyclerView 高度的总和。对于最后一步,我们应该使用如下代码将我们在上一步中编写的接口发送到适配器:
reviewRecyclerAdapter = new ReviewRecyclerAdapter(activity, reviewList, review_recyclerView, this);
当你实现接口时,你应该将它与我使用的上下文一起发送给你 this.
尽情享受
我完全同意 Ashkan 的解决方案,非常感谢(投票 +1!),但有一件事...
如果 RecyclerView 确实在 ScrollView/NestedScrollView 内正确滚动,但它没有抛出(拦截它),那么解决方案是扩展 RecyclerView 并覆盖 OnInterceptTouchEvent 和 OnTouchEvent。如果您不需要任何点击操作,而只是想展示具有工作效果的项目,那么只需 return false 如下所示:
public class InterceptingRecyclerView extends RecyclerView {
public InterceptingRecyclerView(Context context) {
super(context);
}
public InterceptingRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public InterceptingRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
return false;
}
@Override
public boolean onTouchEvent(MotionEvent e) {
return false;
}
}
或者实际上它应该被称为 NonIntercepting... ;) 就这么简单。
[已解决] 我对 Horizontal recycleview 有同样的问题。 为 recycleview
更改 Gradle 回购 compile 'com.android.support:recyclerview-v7:23.2.1'
这样写:linearLayoutManager.setAutoMeasureEnabled(true);
修复了更新中与各种测量规范方法相关的错误
勾选http://developer.android.com/intl/es/tools/support-library/features.html#v7-recyclerview
我发现 23.2.1 库有问题:
当项目是 match_parent 回收视图填充完整项目以查看,请始终使用 min height or "wrap_content".
谢谢
要修复 RecyclerView
中的 fling,您必须覆盖 LinearLayoutManager
中的 canScrollVertically
:
linearLayoutManager = new LinearLayoutManager(context) {
@Override
public boolean canScrollVertically() {
return false;
}
};
如果你只想滚动,那么你可以使用 NestedScrollView 而不是 ScrollView因此,您可以使用以下内容修改代码:
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
//design your content here with RecyclerView
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
将此行用于您的回收站视图:
android:nestedScrollingEnabled="false"
试一试,recyclerview 会平滑滚动,高度灵活
我使用 NestedScrollView
而不是 ScrollView
解决了这个问题。
对于RecyclerView
:
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
在代码中
recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(false);