gpt4 book ai didi

Android:在 viewpager 中使用 recyclerview 滚动问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:36:14 24 4
gpt4 key购买 nike

我在 ViewPager 中有一个 RecyclerView,它只占据屏幕的下半部分,我想做的是如果 滚动整个屏幕>RecyclerView 收到垂直滚动事件。

简而言之,UI 层次结构:

CoordinatorLayout 
--- AppBarLayout
--- Toolbar
--- Bunch of static LinearLayouts, occupy most of screen
--- TabLayout
--- ViewPager
--- Fragments with RecyclerView

我有什么: What I have

根据我的理解,RecyclerView 具有内存效率,并会尝试适应屏幕上的任何可用空间。在我的应用程序中,我有一个 ViewPager 托管多个选项卡,每个选项卡都有一个 RecyclerView 来显示不同的内容。

你能给我一些想法让整个屏幕滚动吗?我猜最好的办法是向屏幕中间的静态内容添加一个具有视差的 CollapsingToolbarLayout。我什至尝试这样做,但用户界面完全被破坏了。这很困难,因为我只想滚动屏幕中间的内容,而不是顶部的工具栏。我对 NestedScrollView 也不太满意,显然它与 ViewPagerCoordinatorLayout 的兼容性不是直接的..

我想要的: What I want

主要 Activity 布局:

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
>

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_contributor"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:focusableInTouchMode="true">

<android.support.v7.widget.SearchView
android:id="@+id/searchview_contributor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:icon="@drawable/ic_search_white_24dp"
app:defaultQueryHint="Bla bla"
app:iconifiedByDefault="false"/>

<ImageButton
android:layout_width="24dp"
android:layout_height="24dp"
android:background="@android:color/transparent"
android:src="@drawable/ic_person_outline_black_24dp"/>

</android.support.v7.widget.Toolbar>

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

<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".5"
android:text="La Bla"/>

<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".5"
android:text="Bla Bla"/>
</LinearLayout>

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

<!-- Bunch of stuff, but irrelevant -->

<android.support.design.widget.TabLayout
android:id="@+id/tablayout_profile"
android:layout_width="match_parent"
android:layout_height="40dp"/>
</LinearLayout>

<android.support.v4.view.ViewPager
android:id="@+id/viewpager_profile"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

Viewpager 中的 fragment :

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview_photos"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>

提前致谢!

更新:我在这里收到的回复(我对此表示感谢)来得太晚了。如果有人知道哪个是正确答案,请告诉我!

最佳答案

public class CustomRecyclerView extends RecyclerView {
public CustomRecyclerView(Context context) {
super(context);
}

public CustomRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public CustomRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

int lastEvent = -1;

boolean isLastEventIntercepted = false;
private float xDistance, yDistance, lastX, lastY;

@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
lastX = e.getX();
lastY = e.getY();

break;

case MotionEvent.ACTION_MOVE:
final float curX = e.getX();
final float curY = e.getY();
xDistance += Math.abs(curX - lastX);
yDistance += Math.abs(curY - lastY);
lastX = curX;
lastY = curY;

if (isLastEventIntercepted && lastEvent == MotionEvent.ACTION_MOVE) {
return false;
}

if (xDistance > yDistance) {

isLastEventIntercepted = true;
lastEvent = MotionEvent.ACTION_MOVE;
return false;
}
}

lastEvent = e.getAction();

isLastEventIntercepted = false;
return super.onInterceptTouchEvent(e);
}

只需通过这个改变你的recyclerview。

关于Android:在 viewpager 中使用 recyclerview 滚动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35082043/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com