Android, как использовать recyclerview для горизонтальной прокрутки в большом вертикальном наборе данных

Я хочу использовать 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;
        }
    }
}

Вот код в моем контейнере EventsView, который имеет

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()) ничего не происходит. Я не хочу прокручивать до новой позиции в списке адаптеров. Я хочу видеть больше данных, которые в настоящее время находятся «за пределами экрана» для элементов, которые в настоящее время находятся на экране. У меня есть статический заголовок в верхней части «списка» с горизонтальной прокруткой. Когда пользователь перетаскивает заголовок, я хочу, чтобы список ниже оставался синхронизированным.

Любая помощь/рекомендации будут оценены


person Henry David Spells III    schedule 10.05.2016    source источник


Ответы (1)


Это оказалось намного проще, чем я думал.

В представлении списка вы получите непредсказуемые результаты, если поместите представление списка внутри 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>
person Henry David Spells III    schedule 16.05.2016