Android如何使用recyclerview在大型垂直数据集中水平滚动

时间:2016-05-10 18:13:18

标签: android android-recyclerview horizontal-scrolling vertical-scrolling

我想使用recylerview显示每行上包含大量数据的大型垂直数据集

我目前正在使用LinearLayoutManager

每行都有自己的ViewHolder,我在其中持有" RowView"宾语。每个RowView都是固定宽度。

public class EventsRecylerAdapter extends RecyclerView.Adapter<EventsRecylerAdapter.ViewHolder>
{
    private Context                                 mContext;
    private ArrayList<EventsStrip.Item>             mItems;

    public EventsRecylerAdapter(Context context, ArrayList<EventsStrip.Item> items) {
        mContext = context;
        mItems = items;
    }

    @Override
    public EventsRecylerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        EventRowView v = new EventRowView(mContext);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        EventsStrip.Item item = mItems.get(position);
        holder.mEventRowView.initItem(item);
    }

    @Override
    public int getItemCount() {
        return mItems.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        // each data item is just a string in this case
        public EventRowView mEventRowView;

        public int getMeasuredHeight() {
            mEventRowView.measure(0, 0);
            return mEventRowView.getMeasuredHeight();
        }

        public ViewHolder(EventRowView v) {
            super(v);
            mEventRowView = v;
        }
    }
}

以下是我的&#34; EventsView&#34;中的代码。容器中有

protected void init(Context context) {
    setOrientation(LinearLayout.VERTICAL);

    ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) getLayoutParams();
    if (null == params)
        params = generateDefaultLayoutParams();
    params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
    params.width = ViewGroup.LayoutParams.WRAP_CONTENT;
    setLayoutParams(params);

    mHeaderScrollView = (HorizontalScrollView) findViewById(R.id.headerScrollView);
    mHeaderScrollView.getViewTreeObserver().addOnScrollChangedListener(new HeaderScrollViewListener());

    mRecyclerView = (RecyclerView) findViewById(R.id.EventsRecylerView);
    mRecyclerView.addOnScrollListener(new RecyclerScrollListener());

    // use a linear layout manager
    mLayoutManager = new LinearLayoutManager(mActivity);
    mRecyclerView.setLayoutManager(mLayoutManager);
}

由于每行都比设备宽,我想启用水平滚动条,所以我可以横向滚动以查看每行中的更多数据。目前,我正在看到我希望看到的所有数据都被截断在屏幕的边缘。

另外,我想以编程方式水平滚动。当我调用scrollTo(newxvalue,recylerview.getScrollY())时没有任何反应。我不想滚动到适配器列表中的新位置。我希望看到更多当前正在关闭屏幕的数据&#34;在屏幕上当前的项目上。我在&#34;列表顶部有一个静态标题&#34;上面有水平滚动视图。当用户拖动标题时,我希望下面的列表保持同步。

任何帮助/指导都将不胜感激

1 个答案:

答案 0 :(得分:0)

事实证明这比我想象的要简单得多。

在列表视图中,如果将列表视图放在ScrollView中,则会得到不可预测的结果。然而,在这种情况下,我只是将标题视图和RecylerView与垂直线性布局管理器放在水平ScrollView中,它看起来像预期的那样(即RecylerView没有与ListView相同的限制)。

<HorizontalScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/headerScrollView"
    >
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:orientation="horizontal"
            android:layout_width="wrap_content"
            android:layout_height="36dp"
            android:background="@color/navigation_bar_color"
            android:id="@+id/eventRowLayout"
            android:paddingTop="5dp"
            android:paddingBottom="5dp"
            android:paddingLeft="2dp"
            android:layout_alignParentTop="true" />

        <android.support.v7.widget.RecyclerView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/EventsRecylerView"
            android:layout_below="@+id/eventRowLayout">
        </android.support.v7.widget.RecyclerView>
    </RelativeLayout>
</HorizontalScrollView>