13

我想知道是否有任何可能的方式使用RecyclerView使用ScrollView里面的RecyclerView灵活的Recycler项目高度

此之前,我使用RecyclerView与修复高度一个滚动型内,但这个时候,我不知道该项目的高度。

提示:自4天前提出这个问题之前,我已经阅读了所有关于堆栈问题的问题和解决方案。

更新: 一些解决学习如何滚动RecyclerView他自己的,但我想将此扩大。

+0

您有什么问题滚动? –

+2

@OmarHassan我应该在** ScrollView **中使用多个** RecyclerView **。只是它 – Ashkan

+0

非上述帮助我......只有这个答案后在这里:[Recyclerview内滚动视图](http://stackoverflow.com/a/36979664/4240256) –

回答

11

我搜索为了回答全世界的这个问题,但我没有找到任何直接的答案这个受欢迎的问题。最后我混合了一些技巧并解决了这个问题!

我的问题开始时,我的老板问我使用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 
     } 
    }); 

与此代码,你找到你物品高度,因为他们建立并发送物品高度到您的活动界面

对于那些有接口问题的朋友,我留下的接口代码应该写在Adapter中。

public interface DynamicHeight { 
    void HeightChange (int position, int height); 
} 

第2步: 我们发现我们的产品高度,到目前为止,现在我们要高度设定为我们的RecyclerView。首先我们应该计算物品高度的总和。在这一步,我们通过的BitMap 第一工具最后一步接口做到这一点,下面写这些代码的活动片段了定义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); 

当你实现接口,你应该把它发送给你与你的情况下,我使用

享受

+0

我不能找出它......得到一些错误..你可以提供适配器类和recyclerview实现的完整示例 –

+0

@HetalUpadhyay哪部分你有错误?这周我没有足够的时间来做这件事。但如果你不在hUrry我会为你做 – Ashkan

+0

其实我没有收到任何错误,但是当我用水平回收站查看它的同一代码时,它什么也没有显示......所以如果你能提供一个代码,它会感激你在水平和垂直滚动两种情况下工作正常 –

2

如果设置固定的高度为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 **。我今天会尝试。 tnx亲爱的朋友 – Ashkan

+1

我没有帮助,正如我之前所说,它有助于滚动RecyclerView自己修复高度。这不是我的目标。 – Ashkan

+0

非常感谢你。只是你的答案帮助我 – neustart47

2

我Ashkan解决方案完全一致,非常感谢(投票+1!),但有一件事...

如果RecyclerView不滚动型/ NestedScrollView内正确地滚动,但它没有按不要匆忙(拦截它),那么解决方案就是扩展RecyclerView并覆盖OnInterceptTouchEvent和OnTouchEvent。如果你不需要任何点击动作,但只是想提出与工作一扔项目则干脆在两个像下面返回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 ...;)这么简单。

7

[已解决]我有同样的问题与水平recycleview。 变化摇篮回购为recycleview

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".

感谢

6

去要解决甩在RecyclerView必须覆盖canScrollVerticallyLinearLayoutManager

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

要添加到此答案,您还需要使用NestedScrollView这个答案本身不适用于Android 7+:\ – OmarBizreh

1

如果你想只是滚动然后你可以使用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> 
3

使用此行到您的recyclerview:

 android:nestedScrollingEnabled="false" 

试试吧,recyclerview会顺利通过灵活高度

相关问题