0

我正在尝试同时为 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>

谁能告诉我一个想法。

4

1 回答 1

0

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

这是一个示例: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;
        }
    }

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

于 2016-06-24T09:43:15.933 回答