Android 使用RecyclerView inside ScrollView和灵活的回收器项目高度

Android 使用RecyclerView inside ScrollView和灵活的回收器项目高度,android,android-scrollview,android-recyclerview,scrollable,Android,Android Scrollview,Android Recyclerview,Scrollable,我想知道是否有任何可能的方法使用回收视图 在此之前,我在滚动视图中使用了带有固定高度的RecyclerView,但这次我不知道项目的高度 提示:在问这个问题之前,我阅读了所有关于堆栈问题的问题和解决方案 更新: 一些解决方案显示了如何单独滚动RecyclerView,但我想显示它已展开。如果为RecyclerView设置固定高度对某人(如我)不起作用,以下是我添加到固定高度解决方案中的内容: mRecyclerView.addOnItemTouchListener(new Recycler

我想知道是否有任何可能的方法使用回收视图

在此之前,我在滚动视图中使用了带有固定高度的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) {

    }
});

我在世界各地寻找这个问题的答案,但我没有找到这个流行问题的任何直接答案。最后我混合了一些技巧解决了这个问题

当我的老板要求我在滚动视图中使用回收视图时,我的问题就开始了。你知道,我们不能在彼此内部使用两个可滚动对象,除非我们为回收视图设置或知道固定项目高度。答案如下:

第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
        }
    });
使用此代码,您可以在物品构建时找到物品高度,并通过界面将物品高度发送到活动中

对于那个些对接口有问题的朋友,我在下面留下了接口代码,这些代码应该在适配器中编写

public interface DynamicHeight {
    void HeightChange (int position, int height);
}
第二步: 到目前为止,我们找到了我们的物品高度,现在我们想为我们的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;
}
当您实现接口时,您应该将它与我使用的的上下文一起发送给您的用户


享受它

我完全同意阿什坎的解决方案,非常感谢(投票+1!),但有一件事

如果RecyclerView确实在ScrollView/NestedScrollView中正确滚动,但没有抛出(拦截),那么解决方案是扩展RecyclerView并覆盖OnInterceptTouchEvent和OnTouchEvent。如果您不需要任何单击操作,但只想使用working fling呈现项目,则只需在两个选项中返回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;
    }
}

或者实际上应该称之为无干扰…;)就这么简单。

[已解决]我对水平回收视图也有同样的问题。 为recycleview更改梯度回购

 compile 'com.android.support:recyclerview-v7:23.2.1'
编写以下内容:
linearLayoutManager.setAutoMeasureEnabled(true)

修复了更新中与各种度量规范方法相关的错误

检查

我发现23.2.1库存在问题: 当项目匹配时,请始终使用
min height或“wrap\u content”填充要查看的完整项目。


感谢修复
回收视图中的fling
您必须在
LinearLayoutManager中覆盖
CanScrollVertical

linearLayoutManager = new LinearLayoutManager(context) {
 @Override
 public boolean canScrollVertically() {
  return false;
 }
};

如果您只想滚动,则可以使用toNestedScrollView而不是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>

//使用RecyclerView在此处设计您的内容

使用此行查看您的recyclerview:

 android:nestedScrollingEnabled="false"

试试看,recyclerview将以灵活的高度平滑滚动

我使用
NestedScrollView
而不是
ScrollView
解决了这个问题。对于
RecyclerView

    <android.support.v7.widget.RecyclerView 
android:layout_width="match_parent"
  android:layout_height="match_parent" />

你的问题是什么?@OmarHassan我应该在ScrollView中使用多个RecyclerView。只是上面的帮助我。。。这里唯一的答案是:@ester你到底想做什么?我花了大约两周的时间来解决我的问题。(当时我不是专家)只是想帮助其他有类似问题的人。。。正如我所做的……我还没有测试它,但我认为您的代码想要自己滚动RecyclerView。我今天要试试。tnx亲爱的朋友,我没有帮上忙,正如我之前所说的,用固定高度滚动RecyclerView会有帮助。这不是我的目标。我想不出来…有一些错误…你能提供适配器类和recyclerview的完整示例吗implementation@HetalUpadhyay哪一部分有错误?这周我没有足够的时间做这件事。但如果你不着急,我会为你做的事实上,我没有得到任何错误,但当我尝试使用水平回收器查看相同的代码时,它不会显示任何内容…因此,如果你能提供一个在水平和垂直两种情况下都能正常工作的代码,我将不胜感激scrolling@HetalUpadhyay你能解释一下你想做什么吗?因为我有一些代码来计算有多少项应该在一个水平的形式与修复width@HetalUpadhyay好的,明白了。我尽量在星期五做。给我发一封电子邮件:ashkan。hematian@gmail.comTo除了这个答案,你还需要使用NestedScrollView这个答案在Android 7+上不起作用:\NestedScrollView代替ScrollView解决了我的问题,谢谢!这应该是公认的答案。没有ConstraintLayout,没有自定义子类。这只是按照预期工作。仅用于记录,可从API 21获得
    <android.support.v7.widget.RecyclerView 
android:layout_width="match_parent"
  android:layout_height="match_parent" />
recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(false);