Comment mettre RecyclerView dans NestedScrollView?

Avec la création de NestedScrollView, vous pouvez placer la vue de défilement dans une autre vue de défilement tant que ceux-ci implémentent correctement NestedScrollingChild et NestedScrollingParent .

(Ce n’est pas un mauvais modèle de conception “Ian Lake (de Google) recommande en fait de placer un RecyclerView intérieur d’une vue d’imbrication ici: plus.google.com/u/0/+AndroidDevelopers/posts/9kZ3SsXdT2T”)

Je veux mettre RecyclerView dans NestedScrollView et heureusement RecyclerView implémente NestedScrollingChild pour que vous puissiez le mettre dans NestedScrollView .

 public class RecyclerView extends ViewGroup implements ScrollingView, NestedScrollingChild 

J’ai lu ces articles:

Comment utiliser RecyclerView dans NestedScrollView?

NestedScrolling avec NestedScrollView, RecyclerView (Horizontal), dans un CoordinatorLayout

Mais le problème avec la solution la plus votée est qu’il appelle tous les éléments de RecyclerView , par exemple s’il s’agit d’un RecyclerView sans fin et quand l’utilisateur atteint la fin de la liste, vous voulez faire une requête réseau avec cette solution. serveur à plusieurs resockets car il atteint automatiquement le dernier élément de RecyclerView .

Quoi qu’il en soit, comment définir le paramètre pour que je puisse insérer RecyclerView dans NestedScrollView (en fait, je veux placer un groupe de vues comme framelayout ou relativelayout comme un enfant unique de nestedscrollview, puis placer recyclerview dans framelayout ou relativelayout)

Lorsque je mets RecyclerView dans NestedScrollView il n’y a rien à afficher.


Pour créer un projet exemple, vous pouvez utiliser cheesesquare et modifier CheeseDetailActivity pour avoir un RecyclerView.


Bien que la réponse de BNK ne soit pas correcte, BNK a beaucoup essayé. Je lui accorde donc la prime. Toujours à la recherche d’une solution agréable ….

    Voici ma nouvelle réponse mise à jour:

                      

    En activité:

      RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(true); // true: with header RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview); final MyLinearLayoutManager layoutManager = new MyLinearLayoutManager(this, LinearLayoutManager.VERTICAL, false, getScreenHeight(this)); // final CustomLinearLayoutManager layoutManager = new CustomLinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(recyclerViewAdapter); // recyclerView.setNestedScrollingEnabled(false); // Disables scrolling for RecyclerView, however, CustomLinearLayoutManager used instead of MyLinearLayoutManager 

    J’ai également mis à jour le projet exemple de My GitHub

    Capture d’écran:

    entrer la description de l'image ici


    Voici la solution pour appeler le serveur uniquement lorsque vous avez vraiment besoin de charger plus de données. De cette façon, vous pouvez placer votre RecyclerView sans fin et de nombreuses autres vues dans NestedScrollView. Pour moi, ça marche bien.

    1. Créez la classe EndlessParentScrollListener pour gérer les événements de défilement de NestedSrollView.

     public abstract class EndlessParentScrollListener implements NestedScrollView.OnScrollChangeListener { // The current offset index of data you have loaded private int currentPage = 0; // The total number of items in the dataset after the last load private int previousTotalItemCount = 0; // True if we are still waiting for the last set of data to load. private boolean loading = true; // Sets the starting page index private int startingPageIndex = 0; // The minimum amount of pixels to have below your current scroll position // before loading more. private int visibleThresholdDistance = 300; RecyclerView.LayoutManager mLayoutManager; public EndlessParentScrollListener(RecyclerView.LayoutManager layoutManager) { this.mLayoutManager = layoutManager; } @Override public void onScrollChange(NestedScrollView scrollView, int x, int y, int oldx, int oldy) { // We take the last son in the scrollview View view = scrollView.getChildAt(scrollView.getChildCount() - 1); int distanceToEnd = (view.getBottom() - (scrollView.getHeight() + scrollView.getScrollY())); int totalItemCount = mLayoutManager.getItemCount(); // If the total item count is zero and the previous isn't, assume the // list is invalidated and should be reset back to initial state if (totalItemCount < previousTotalItemCount) { this.currentPage = this.startingPageIndex; this.previousTotalItemCount = totalItemCount; if (totalItemCount == 0) { this.loading = true; } } // If it's still loading, we check to see if the dataset count has // changed, if so we conclude it has finished loading and update the current page // number and total item count. if (loading && (totalItemCount > previousTotalItemCount)) { loading = false; previousTotalItemCount = totalItemCount; } // If it isn't currently loading, we check to see if we have breached // the visibleThreshold and need to reload more data. // If we do need to reload some more data, we execute onLoadMore to fetch the data. // threshold should reflect how many total columns there are too if (!loading && distanceToEnd <= visibleThresholdDistance) { currentPage++; onLoadMore(currentPage, totalItemCount); loading = true; } } // Defines the process for actually loading more data based on page public abstract void onLoadMore(int page, int totalItemsCount); } 

    2. Définir l'auditeur

     private void initRecycler() { //TODO init recycler adapter here recycler.setNestedScrollingEnabled(false); LinearLayoutManager _layoutManager = new LinearLayoutManager(this); recycler.setLayoutManager(_layoutManager); NestedScrollView scrollView = (NestedScrollView) findViewById(R.id.scrollView); scrollView.setOnScrollChangeListener(new EndlessParentScrollListener(_layoutManager) { @Override public void onLoadMore(int page, int totalItemsCount) { if (loadedItemCount < serverItemsCount) customLoadMoreDataFromApi(); } }); customLoadMoreDataFromApi(); } 

    Xml court si quelqu'un le trouve utile:

       ...          

    Donc, mettre RecyclerView directement dans NestedScrollView n’affichera malheureusement rien. Cependant, il existe un moyen de placer indirectement la recyclerview dans NestedScrollView – utilisez simplement un frameLayout comme tiers pour stocker votre recyclerview.

    C’est le framelayout qui contient la recyclerview nestede dans votre classe d’ activité :

          

    Placez votre fragment dans le framelayout (le code se trouve dans la classe d’ activité ):

      ExampleFragment exampleFragment = new ExampleFragment(); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.add(R.id.container, exampleFragment); ft.commit(); 

    Dans votre exemple , vous pouvez ensuite mettre votre liste de recyclage.

          

    Ceci est le code du fragment :

     @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); llLayout = (RelativeLayout) inflater.inflate(R.layout.example_fragment_layout, container, false); mRecyclerView = (RecyclerView) llLayout.findViewById(R.id.my_recycler_view); 

    Voici la disposition de CheeseSquare XML que vous devriez avoir: