web-dev-qa-db-fra.com

NestedScrollView défile vers le haut sur Recyclerview redimensionné

J'ai un NestedScrollView contenant un LinearLayout et un RecyclerView (tous deux à l'intérieur d'un RelativeLayout).

<Android.support.design.widget.CoordinatorLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

<Android.support.v4.widget.NestedScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:id="@+id/scroll">

    <RelativeLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:id="@+id/lay_account">


        <LinearLayout
                Android:orientation="vertical"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:background="@Android:color/white"
                Android:paddingTop="10dp"
                Android:id="@+id/lay_total"
                Android:paddingBottom="10dp">

            <TextView
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:text="@string/total"
                    Android:id="@+id/lblTotal"
                    Android:textSize="@dimen/text_medium"
                    Android:layout_marginLeft="20dp"
                    Android:textColor="@color/dark_eurakostheme_color"
                    Android:textStyle="bold"/>


            <LinearLayout
                    Android:orientation="horizontal"
                    Android:layout_width="fill_parent"
                    Android:layout_height="wrap_content"
                    Android:gravity="center_vertical|center_horizontal">

                <TextView
                        Android:layout_width="wrap_content"
                        Android:layout_height="wrap_content"
                        Android:id="@+id/txtTotalAmount"
                        Android:textSize="@dimen/text_extra_extra_large"
                        Android:gravity="center_horizontal"
                        Android:textColor="@color/eurakostheme_color"/>

                <ImageView
                        Android:layout_width="@dimen/icon_extra_extra_large"
                        Android:layout_height="match_parent"
                        Android:id="@+id/imageView3"
                        Android:src="@drawable/coin_eurakos"/>
            </LinearLayout>

        </LinearLayout>

        <View
                Android:layout_width="fill_parent"
                Android:layout_height="1dp"
                Android:id="@+id/divisor"
                Android:background="@color/dividerColor"
                Android:layout_alignBottom="@+id/lay_total"/>

        <Android.support.v7.widget.RecyclerView
                Android:layout_below="@id/lay_total"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:id="@+id/rclBasketAmounts"
                Android:background="@Android:color/white"
                Android:padding="10dp">
        </Android.support.v7.widget.RecyclerView>

    </RelativeLayout>

</Android.support.v4.widget.NestedScrollView>
</Android.support.design.widget.CoordinatorLayout>

Après avoir chargé les données dans RecyclerView, je dois modifier sa hauteur par programme comme ceci:

RelativeLayout.LayoutParams lay_params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
    50 + ((int) (baskets.length * getResources().getDimension(R.dimen.list_height_small))));

lay_params.addRule(RelativeLayout.BELOW, lay_total.getId());
recyclerView.setLayoutParams(lay_params);
recyclerView.setAdapter(new ListBasketAmountAdapter(baskets));

Le problème est lorsque les données ont fini de charger les rouleaux NestedScrollView défile automatiquement vers le haut de RecyclerView, cachant le LinearLayout au-dessus. Des idées?

Merci.

28
kevings14

Après plusieurs jours, j'ai trouvé une solution au problème. Vous avez juste besoin d'ajouter le descendantFocusability dans la première mise en page sous le ScrollView comme ceci:

<RelativeLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:id="@+id/lay_account"
    Android:descendantFocusability="blocksDescendants">
98
kevings14

La solution proposée par kevings14 fonctionne mais elle n'a pas été utile dans mon cas. J'ai un RecyclerView + quelques EditText sous NestedScrollView, quand j'ai ajouté

Android:descendantFocusability="blocksDescendants"

dans la disposition principale sous la vue de défilement. Je n'ai pas pu concentrer EditText.

Ensuite, j'ai trouvé cette solution, qui a fonctionné pour moi.

<RelativeLayout
   Android:layout_width="match_parent"
   Android:focusable="true"
   Android:focusableInTouchMode="true"
   Android:layout_height="wrap_content">
15
Noman Rafique

Dans mon cas, j'utilise plusieurs RecyclerView dans NestedScrollView. Alors ça ne marche pas pour moi. Donc, ma solution est la suivante: lorsque ma mise à jour des données est terminée, je fais simplement défiler vers le haut,

yourList.setAdapter(yourListAdapter);

scrollView.post(new Runnable() {
    @Override
    public void run() {
         scrollView.fullScroll(ScrollView.FOCUS_UP);
         //scrollView.scrollTo(0,0);
    }
});
3
Md Imran Choudhury