Android:viewpager中的recyclerview滚动问题
我在ViewPager
内有一个RecyclerView
,它仅占据屏幕的下半部分,如果RecyclerView
收到了垂直滚动事件,我想做的就是让整个屏幕滚动.
I have a RecyclerView
inside a ViewPager
that only occupies the bottom half of the screen, and what I want to do is have the entire screen scroll if the RecyclerView
s received a vertical scroll event.
UI层次结构简而言之:
UI hierarchy in a nutshell:
CoordinatorLayout
--- AppBarLayout
--- Toolbar
--- Bunch of static LinearLayouts, occupy most of screen
--- TabLayout
--- ViewPager
--- Fragments with RecyclerView
我所拥有的:
据我所知,RecyclerView
是内存有效的,并且试图使其适合屏幕上可用的任何空间.在我的应用程序中,我有一个ViewPager
承载多个选项卡,每个选项卡都有一个RecyclerView
来显示不同的内容.
To my understanding, a RecyclerView
is memory-efficient and tries to fit itself in whatever space is available in the screen. In my app, I have a ViewPager
hosting multiple tabs, each of which have a RecyclerView
to display different things.
您能给我一些我可以使整个屏幕滚动的想法吗?我猜最好的拍摄方法是在屏幕中间的静态内容中添加具有视差的CollapsingToolbarLayout
.我什至尝试这样做,但是UI完全坏了.这很困难,因为我只希望滚动屏幕中间的内容,而不是滚动顶部的工具栏.我也不太喜欢NestedScrollView
,显然它与ViewPager
和CoordinatorLayout
的兼容性也不是很直接.
Could you please give me some ideas of what I could do to make the whole screen scroll? I'm guessing the best shot is to add a CollapsingToolbarLayout
with parallax to the static content in the middle of the screen. I even tried to do this, but the UI was completely broken. It's difficult since I only want the content in the middle of the screen to scroll out, not the toolbars on top. I didn't have much luck with a NestedScrollView
either, apparently its compatibility with ViewPager
and CoordinatorLayout
is not straight-forward..
我想要的东西:
主要活动布局:
<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中的片段:
The fragment inside the Viewpager:
<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>
提前谢谢!
更新:我在这里收到的回复(对此非常感谢)来得太晚了.如果有人知道哪个是正确答案,请告诉我!
Update: The responses I received here (for which I am thankful) came a bit too late. If anyone knows which is the correct answer, please let me know!
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);
}
}
仅通过this更改您的回收站视图.
Just change your recyclerview by this .