在ScrollView中使用RecyclerView,灵活的Recycler项目高度

时间:2015-09-06 06:38:09

标签: android android-scrollview android-recyclerview scrollable

我想知道有没有办法使用 RecyclerView

在此之前我在 ScrollView 中使用了修复高度的RecyclerView,但这次我不知道项目的高度。

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

更新 一些解决方案学习如何自己滚动 RecyclerView ,但我想展示这个扩展。

8 个答案:

答案 0 :(得分:14)

如果您只想滚动,那么您可以使用 NestedScrollView 而不是 ScrollView 所以您可以使用以下代码修改您的代码:

.hide(400)

答案 1 :(得分:10)

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

当我的老板让我在 ScrollView 中使用 RecyclerView 时,我的问题就出现了,而且你知道我们不能使用两个 Scrollable 对象除非我们为 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);

当您实施界面时,您应该将其发送给您使用的上下文。

享受它

答案 2 :(得分:8)

将此行用于您的recyclerview:

android:nestedScrollingEnabled="false"

尝试一下,recyclerview将以灵活的高度顺利滚动

答案 3 :(得分:7)

[已解决] 我对Horizo​​ntal recycleview也有同样的问题。 更改gradle repo for recycleview

{$date|timeAgo}

写下: compile 'com.android.support:recyclerview-v7:23.2.1'

修复了与更新中的各种measure-spec方法相关的错误

检查http://developer.android.com/intl/es/tools/support-library/features.html#v7-recyclerview

我发现了23.2.1库的问题: 当item为match_parent回收视图时,请填写要查看的完整项目,请始终使用linearLayoutManager.setAutoMeasureEnabled(true);

由于

答案 4 :(得分:6)

要修复RecyclerView中的投掷,您必须覆盖canScrollVertically中的LinearLayoutManager

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

答案 5 :(得分: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) {

    }
});

答案 6 :(得分:2)

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

如果RecyclerView在ScrollView / 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 :(得分:1)

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

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

在代码中

recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(false);