为了账号安全,请及时绑定邮箱和手机立即绑定

水平 RecyclerView 内的水平 RecyclerView

水平 RecyclerView 内的水平 RecyclerView

翻过高山走不出你 2021-07-13 05:08:15
我正在尝试在另一个带有 Horizontal LinearLayoutManager 的 RecyclerView 中使用带有 Horizontal LinearLayoutManager 的 RecyclerView。整个层次结构是这样的:RecyclerView,Recycler 的子元素是一个 ScrollView,它包含一个 TextView 和另一个 RecyclerView。为了更好地理解,我希望第一个回收器的工作方式类似于但不完全相同的 ViewPager(我不想使用 ViewPager)。问题是当我尝试在子回收器上水平滚动时,运动事件被父回收器捕获,导致滚动到下一页而无法滚动子回收器。主活动布局:<?xml version="1.0" encoding="utf-8"?><LinearLayout     xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity">    <android.support.v7.widget.RecyclerView        android:id="@+id/RVpage"        android:descendantFocusability="blocksDescendants"        android:focusableInTouchMode="false"        android:focusable="false"        android:layout_width="match_parent"        android:layout_height="match_parent" /></LinearLayout>主活动.java:public class MainActivity extends AppCompatActivity {    private RecyclerView recyclerView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        setRecycler();    }    private void setRecycler() {        recyclerView=(RecyclerView) findViewById(R.id.RVpage);        SnapHelper snapHelper = new LinearSnapHelper();        snapHelper.attachToRecyclerView(recyclerView);        BigRecyclerAdapter bigRecyclerAdapter=new BigRecyclerAdapter(this);        recyclerView.setAdapter(bigRecyclerAdapter);        //recyclerView.setNestedScrollingEnabled(true);        recyclerView.setLayoutManager(new LinearLayoutManager(            this, LinearLayoutManager.HORIZONTAL, false)        );    }}
查看完整描述

2 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

我在嵌套ScrollView之前实现过,我认为子滚动视图总是消耗触摸,而父滚动视图永远不会听它们


这是 onInterceptTouchEvent控制视图是消耗触摸还是将其传递给其父级的方法的作用。


所以计划是计算滚动的方向,我是否到达了子 ScrollView 的滚动结束。


这段代码是 2 年前写的,所以如果有些东西被弃用了,请原谅。


public class CustomScrollView extends ScrollView {


private boolean bottomReached = false;

private boolean topReached = true;

private float startTouch = -1;

private float distance = -1;


public CustomScrollView(Context context) {

    super(context);

}


public CustomScrollView(Context context, AttributeSet attrs) {

    super(context, attrs);

}


public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {

    super(context, attrs, defStyleAttr);

}


@Override

protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {

    super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);

}


@Override

public boolean onInterceptTouchEvent(MotionEvent ev) {

    switch (ev.getAction()) {

        case MotionEvent.ACTION_DOWN:

            startTouch = ev.getY();

            break;

        case MotionEvent.ACTION_UP:

            startTouch = -1;

            break;

        case MotionEvent.ACTION_MOVE:

            distance = ev.getY() - startTouch;

                if (Math.abs(distance) < 10) {

                    boolean onIntercept = super.onInterceptTouchEvent(ev);

                    return onIntercept;

                } else {

                    if (!bottomReached && !topReached) {

                        return true;

                    } else {

                        if (distance > 0) {

                            // Scrolling Up

                            return bottomReached;

                        } else {

                            // Scrolling Down

                            return topReached;

                        }

                    }

                }

    }

    return super.onInterceptTouchEvent(ev);

}


@Override

public boolean onTouchEvent(MotionEvent ev) {

    switch (ev.getAction()) {

        case MotionEvent.ACTION_DOWN:

            startTouch = ev.getY();

            break;

        case MotionEvent.ACTION_UP:



            startTouch = -1;

            break;

        case MotionEvent.ACTION_MOVE:

            distance = ev.getY() - startTouch;

    }

    return super.onTouchEvent(ev);

}

}



查看完整回答
反对 回复 2021-07-14
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

看看这个站点和他在 GitHub Nested Recyclerview上的代码


查看完整回答
反对 回复 2021-07-14
  • 2 回答
  • 0 关注
  • 230 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信