【问题标题】:Android: Horizontal and vertical scroll for recyclerviewAndroid:recyclerview的水平和垂直滚动
【发布时间】:2016-10-26 20:42:16
【问题描述】:

我正在尝试同时为 Recycler 视图实现水平和垂直滚动。我必须显示一个 8 列的表格,因此我计划同时实现水平和垂直滚动。

我在列表行中尝试了 Horizo​​ntalScrollView,但它在一行中水平滚动。 我还尝试将 Horizo​​ntalScrollView 作为 recyclerview 的父级,但它不起作用

list_row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:clickable="true"
android:background="?android:attr/selectableItemBackground"
android:orientation="vertical">


<TextView
    android:id="@+id/title"
    android:textColor="@color/title"
    android:textStyle="bold"
    android:layout_alignParentTop="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

    android:text="aaa"/>

<TextView
    android:layout_toRightOf="@+id/title"
    android:id="@+id/genre"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:text="bbb"/>

<TextView
    android:layout_toRightOf="@+id/genre"
    android:id="@+id/year"
    android:textColor="@color/year"
    android:layout_width="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_marginLeft="20dp"
    android:layout_height="wrap_content"
    android:text="ccc"/>

 </RelativeLayout>

Activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<HorizontalScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fillViewport="true" >
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
 </LinearLayout>
 </HorizontalScrollView>
 </LinearLayout>

谁能告诉我一个想法。

【问题讨论】:

    标签: android android-recyclerview horizontalscrollview vertical-scroll


    【解决方案1】:

    到目前为止,我发现在一个视图上进行水平和垂直滚动的最佳解决方案是将其放在一个 FrameLayout 中。然后,您的视图必须实现 OnTouch(您可以在 Activity 中执行此操作),并且您只需在触摸指针移动时滚动它。

    这是一个例子: xml:

    <FrameLayout
     android:id="@+id/TwoWaysScrollableContainer"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:clipToPadding="false">
        <YourView
            android:id="@+id/GridContainer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="false" />
     </FrameLayout>
    

    C#(我使用 xamarin,但我认为 Java 不会有这么多不同) :

    public class MyActivity : Activity
        {
            private MyView _myView; //Can be GridView, relative layout or wathever
            private float _startX, _startY,_prevDx, _prevDy, _dx,_dy;
            protected override void OnCreate(Bundle bundle)
            {
                base.OnCreate(bundle);
            _myView = FindViewById<MyView>(Resource.Id.GridContainer);
            }
    
            public bool OnTouch(View v, MotionEvent e)
            {
                switch (e.Action)
                {
                    case MotionEventActions.Down:
                        {
    
                            mode = Mode.DRAG;
                            startX = e.GetX() - prevDx;
                            startY = e.GetY() - prevDy;
    
                            break;
                        }
                     case MotionEventActions.Move:
                        {
                            /* you also could add logic to prevent your view from scrolling out of you grid bounds*/
                            if (mode == Mode.DRAG)
                            {
                                dx = startX - e.GetX();
                                dy = startY - e.GetY();
                                _myView.ScrollBy((int)(dx), (int)(dy));
    
                                startX = e.GetX();
                                startY = e.GetY();
                            }
                            break;
                        }
                   case MotionEventActions.Up:
                        {
                            mode = Mode.NONE;
                            prevDx = dx;
                            prevDy = dy;
                            break;
                        }
                  }
                  return true;
            }
        }
    

    我知道这并不能直接回答您的问题(我对回收站视图了解不多),但我希望它仍然可以帮助您。我将它用于瓷砖引擎,它做得非常好。

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 2015-05-31
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多