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.
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">
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">
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);
}
});