Как прокрутить до определенной позиции в recyclerview внутри scrollview?

Я много искал по моему запросу, и ни один из них не был полезен. У меня есть recyclerview и некоторые статические данные внутри представления прокрутки, которое находится внутри корневого родительского макета, как показано ниже.

я поставил-

scrollview.scrollto(0,0);

потому что каждый раз, когда я открываю активность, она переходит к первому элементу recyclerview и пропускает статические данные над recyclerview.

recyclerview.setNestedScrollingEnabled(false); 
recyclerview.setfocusable(false);

для плавной прокрутки.

проблема с-

layoutmanager.scrollToPositionWithOffset(pos,0);

это не работает. Я установил указанную выше строку после настройки адаптера на recyclerview. Также пробовал с NestedScrollView, но тщетно.

хотя я использовал

layoutmanager.scrollToPosition(pos);

Для тех, кто пропустит код, я установил для match_parent значение ScrollView, а для fillviewport — значение true.

Вот мой макет.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/bottomsheet"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.inkdrops.khaalijeb.BrandCouponActivity">

    <RelativeLayout
        android:id="@+id/inclusionviewgroup"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <static data/>

        <ScrollView
            android:id="@+id/scrollviewmain"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/one"
            android:fillViewport="true"
            android:scrollbars="none"
            android:layout_above="@+id/donelayout">


            <staticdata/>

                <TextView
                    android:id="@+id/dealstext"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/card1"
                    android:layout_marginTop="10dp"
                    android:layout_marginLeft="10dp"
                    android:textSize="16sp"
                    android:text="Deals &amp; Coupons"
                    android:textColor="#444444" />

                <RelativeLayout
                    android:id="@+id/recyclerlayout"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/dealstext"
                    android:layout_marginTop="5dp"
                    android:layout_marginLeft="8dp"
                    android:layout_marginRight="8dp"
                    android:background="@color/colorbackground">

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/coupon_rec_view"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@color/colorbackground"
                        android:visibility="visible"/>


                </RelativeLayout>

                <statisdata>


            </RelativeLayout>

        </ScrollView>

        include layout="@layout/activity_coupons"
            android:visibility="gone"
            />

    </RelativeLayout>

</RelativeLayout>

comment
Не могли бы вы также опубликовать свой код для Android? Вы уверены, что ссылаетесь на правильный layoutManager? Не RecyclerView, а ScrollView, верно?   -  person Felix Guo    schedule 25.07.2017
comment
Вы хотите сохранить положение прокрутки при вращении или просто программно хотите прокрутить до определенной позиции?   -  person akshay_shahane    schedule 25.07.2017
comment
вставьте свой адаптер и связанный с ним код действия/фрагмента, а также @akshay_shahane.   -  person Radhey    schedule 26.07.2017


Ответы (5)


Нужно прокрутить ScrollView, получив верхнюю позицию дочернего элемента RecyclerView:

float y = recyclerView.getY() + recyclerView.getChildAt(selectedPosition).getY();    
scrollView.smoothScrollTo(0, (int) y);
person Vaibhav Jani    schedule 28.12.2016

вы можете использовать метод просмотра прокрутки, чтобы достичь желаемых мест, как:

scrollView.smoothScrollTo(int x, int y);
person Pratik Pitale    schedule 26.07.2017

Я знаю, что отвечаю довольно поздно, но если у вас возникла проблема с автоматической прокруткой, вам нужно добавить android:descendantFocusability="blocksDescendants" в свой RelativeLayout. Итак, ваш тег RealtiveLyout будет выглядеть так:

<RelativeLayout
    android:id="@+id/inclusionviewgroup"
    android:layout_width="match_parent"
    android:descendantFocusability="blocksDescendants"
    android:layout_height="match_parent">
person Abhi    schedule 21.04.2017

Шаг 1: добавьте эту строку для выбора этой позиции в recyclerview

  adaptercat.setSelectedItem(Integer.parseInt(dealtypeid));

Шаг 2: Один раз проверьте ниже конструктор, получив текущую позицию

  public CatgerotyAdapter(Context context, ArrayList<HashMap<String, String>> arraylist,String selectedPosition) {
        this.context = context;
        this.data = arraylist;
        resultp = new HashMap<>();
        currentItemPos=Integer.parseInt(selectedPosition)-1;
    }

Шаг 3: И эта функция также в адаптере

  public void setCurrentItem(int item)
    {
        this.currentItemPos = item;
    }

Последний шаг 4. Добавьте эту функцию вне адаптера в свой класс.

 private void onPagerItemClick2(Integer tag)
{
    adaptercat.setCurrentItem(tag);
    catsp.setAdapter(adaptercat);
}

Поместите эту строку в свой элемент списка, нажмите listner

  ((ClassName) context).onPagerItemClick2(position);

Эта позиция будет выбрана, когда вы откроете список.

person Venkatesh    schedule 25.07.2017

Используйте этот метод scrollToPosition (int position) это работа для меня. Надеюсь, что это поможет вам.

        mMessagesRecyclerView = (RecyclerView) findViewById(R.id.messagesRecyclerView);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setStackFromEnd(true);

        mMessagesRecyclerView.setLayoutManager(layoutManager);
        mMessagesAdapter = new MessagesAdapter();
        mMessagesRecyclerView.setAdapter(mMessagesAdapter);

        mMessagesRecyclerView.scrollToPosition(your position);

это мой компоновщик

введите здесь описание изображения

person yathavan    schedule 25.07.2017