首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >水平RecyclerView中的水平RecyclerView

水平RecyclerView中的水平RecyclerView
EN

Stack Overflow用户
提问于 2018-08-13 18:02:18
回答 2查看 1.7K关注 0票数 3

我正在尝试在另一个具有水平LinearLayoutManager的RecyclerView中使用具有水平LinearLayoutManager的RecyclerView。整个层次结构是这样的: RecyclerView,回收器的孩子是一个ScrollView,它包含一个TextView和另一个RecyclerView。为了更好地理解,我希望第一个回收器的工作方式类似于ViewPager (我不想使用ViewPager),但不完全相同。问题是,当我试图在子回收器上水平滚动时,运动事件被父回收器捕获,导致滚动到下一页,而无法滚动子回收器。

MainActivityLayout:

代码语言:javascript
复制
<?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>

MainActivity.java:

代码语言:javascript
复制
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)
        );
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                //Toast.makeText(MainActivity.this, "CHANGED BIG", Toast.LENGTH_SHORT).show();
                super.onScrollStateChanged(recyclerView, newState);
            }
        });
    }
}

PageRecycler布局:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<ScrollView             xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:text="nskjdnaskdn \n sudbadbak
\n sudbadbak
\n sudbadbak
\n sudbadbak
\n sudbadbak\n sudbadbak
v
\n sudbadbak
\n sudbadbak
\n sudbadbak
\n sudbadbak
\n sudbadbak
\n sudbadbak
\n sudbadbak
\n sudbadbak
v
v
\n sudbadbak
\n sudbadbak
v
v
\n sudbadbak
vv
\n sudbadbak
v
v
\n sudbadbak"
        android:textColor="@android:color/black"
        android:textSize="50sp"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/photo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:focusableInTouchMode="true"
        android:focusedByDefault="true"
        android:descendantFocusability="afterDescendents"
        android:focusable="true"
        android:padding="20dp" />

    </LinearLayout>

</ScrollView>

从clickable=true到descendentFocusability,我把我尝试过的所有东西都留在了relativeLayout中。

PageRecycler适配器:

代码语言:javascript
复制
class BigRecyclerAdapter(private val context: MainActivity) :     RecyclerView.Adapter<BigRecyclerAdapter.ViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
        val v = LayoutInflater.from(parent?.context)
            .inflate(R.layout.raw, parent, false)

        return ViewHolder(v)
    }

/* override fun onViewAttachedToWindow(holder: ViewHolder?) {
    var parent = holder?.recycler?.parent


    val DEBUG_TAG_SCROLL = "DEBUG_TAG_SCROLL"
    Log.d(DEBUG_TAG_SCROLL, "NESTED_SCROLL_VALUE: ${holder?.recycler?.hasNestedScrollingParent()}")



    if (holder?.recycler?.parent is RecyclerView) {
        Log.d(DEBUG_TAG_SCROLL, "Good parent")
    }
    super.onViewAttachedToWindow(holder)
}*/

    override fun getItemCount(): Int {
        return 5
    }

    override fun onBindViewHolder(holder: ViewHolder?, position: Int) {

        holder?.bind()
//        val DEBUG_TAG_SCROLL = "DEBUG_TAG_SCROLL"
////        Log.d(DEBUG_TAG_SCROLL, "NESTED_SCROLL_VALUE: ${holder?.recycler?.hasNestedScrollingParent()}")
//
//        if(holder?.recycler?.parent is RecyclerView){
//            Log.d(DEBUG_TAG_SCROLL, "Good parent")
//        }
    }


    inner class ViewHolder(v: View) : RecyclerView.ViewHolder(v) {
        var recycler: RecyclerView

        init {
            recycler = v.findViewById(R.id.photo) as RecyclerView
        }

        fun bind() {
            recycler.addOnScrollListener(object : RecyclerView.OnScrollListener() {
                override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
                    Toast.makeText(context, "CHANGED SMALL", Toast.LENGTH_SHORT).show()
                    super.onScrollStateChanged(recyclerView, newState)
                }

//            override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
//                super.onScrolled(recyclerView, dx, dy)
//            }
            })

            val smallRecyclerAdapter = SmallRecyclerAdapter(context)
            recycler.adapter = smallRecyclerAdapter
            recycler.layoutManager = LinearLayoutManager(
                    context, LinearLayoutManager.HORIZONTAL, false
            )
            recycler.scrollToPosition(5)
        }
    }
}

PhotoRecycler raw (子recyclerView):

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/photoView"/>

</LinearLayout>

PhotoRecycler适配器:

代码语言:javascript
复制
class SmallRecyclerAdapter(private val context: MainActivity): RecyclerView.Adapter<SmallRecyclerAdapter.ViewHolder>(){
    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
        val v = LayoutInflater.from(parent?.context)
            .inflate(R.layout.raw_small, parent, false)
        // set the view's size, margins, paddings and layout parameters

        return ViewHolder(v)
    }

    override fun getItemCount(): Int {
        return 10
    }

    override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
        //TODO here

        var drawableName="p"+((position%4)+1)
        val drawable =  context.getResources().getDrawable(context.getResources()
            .getIdentifier(drawableName, "drawable", context.getPackageName()))
        holder?.imageView?.setImageDrawable(drawable)
    }


    inner class ViewHolder(v: View) : RecyclerView.ViewHolder(v) {
        var imageView: ImageView

        init {
            imageView=v.findViewById(R.id.photoView) as ImageView
        }
    }
}

如果你需要更多的细节,让我知道,我会更新。

EN

回答 2

Stack Overflow用户

发布于 2018-10-05 07:38:29

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

这就是onInterceptTouchEvent方法的作用,它控制视图是使用触摸还是只是将其传递给其父对象。

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

这段代码是2年前写的,所以如果有些地方被否决了,请原谅。

代码语言:javascript
复制
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);
}
}
票数 0
EN

Stack Overflow用户

发布于 2018-10-05 06:34:30

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51819785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档