usar tag manager instalar gtm google cómo configurar como android android-recyclerview endlessscroll staggeredgridlayout

android - tag - gtm console



Cómo implementar el desplazamiento sin fin usando StaggeredLayoutManager (4)

Esta es mi implementación de un ScrollListener .

Aquí está mi código para implementar el ScrollListener :

private EndlessScrollListener scrollListener = new EndlessScrollListener(new EndlessScrollListener.RefreshList() { @Override public void onRefresh(int pageNumber) { //Here you can execute server connection or anything else to update data and present with Recycler view // Notice: It is sync method } }); recyclerView.addOnScrollListener(scrollListener);

ScrollListener personalizada ScrollListener :

class EndlessScrollListener extends RecyclerView.OnScrollListener { private boolean isLoading; private boolean hasMorePages; private int pageNumber = 0; private RefreshList refreshList; private boolean isRefreshing; private int pastVisibleItems; public EndlessScrollListener(RefreshList refreshList) { this.isLoading = false; this.hasMorePages = true; this.refreshList = refreshList; } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); StaggeredGridLayoutManager manager = (StaggeredGridLayoutManager) recyclerView.getLayoutManager(); int visibleItemCount = manager.getChildCount(); int totalItemCount = manager.getItemCount(); int[] firstVisibleItems = manager.findFirstVisibleItemPositions(null); if (firstVisibleItems != null && firstVisibleItems.length > 0) { pastVisibleItems = firstVisibleItems[0]; } if ((visibleItemCount + pastVisibleItems) >= totalItemCount && !isLoading) { isLoading = true; if (hasMorePages && !isRefreshing) { isRefreshing = true; new Handler().postDelayed(new Runnable() { @Override public void run() { refreshList.onRefresh(pageNumber); } }, 200); } } else { isLoading = false; } } public void noMorePages() { this.hasMorePages = false; } public void notifyMorePages() { isRefreshing = false; pageNumber = pageNumber + 1; } public interface RefreshList { void onRefresh(int pageNumber); } }

Ya intenté implementar el desplazamiento sin fin para LinearLayoutManager y fue exitoso e intenté copiar la implementación de LinearLayoutManager en StaggeredGridLayoutManager pero no funciona.

Solo quiero obtener el primer objeto visible.

en LinearLayoutManager:

int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition(int);

pero en StaggeredGridLayoutManager es:

int firstVisibleItem = staggeredGridLayoutManager.findFirstVisibleItemPositions(int[])

¿Cómo obtener el primer objeto visible usando (int) no (int [])?

¿Hay algún buen enfoque / implementación sobre esto?

Gracias por adelantado.


Lo tengo funcionando:

Puede usar uno de los dos métodos en el StaggeredGridLayoutManager:

  1. findFirstVisibleItemPositions(int[])
  2. findFirstCompletelyVisibleItemPositions(int[])

Pase una matriz int vacía que se inicializará con las posiciones y use la que tenga sentido para usted.

private boolean loading = true; private int pastVisibleItems, visibleItemCount, totalItemCount; mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener({ @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { visibleItemCount = mLayoutManager.getChildCount(); totalItemCount = mLayoutManager.getItemCount(); int[] firstVisibleItems = null; firstVisibleItems = mLayoutManager.findFirstVisibleItemPositions(firstVisibleItems); if(firstVisibleItems != null && firstVisibleItems.length > 0) { pastVisibleItems = firstVisibleItems[0]; } if (loading) { if ((visibleItemCount + pastVisibleItems) >= totalItemCount) { loading = false; Log.d("tag", "LOAD NEXT ITEM"); } } } });


Para implementar EndlessRecyclerOnScrollListener primero cree la clase java EndlessRecyclerOnScrollListener

import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener { public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName(); private int scrolledDistance = 0; private boolean controlsVisible = false; private boolean loading = true; // True if we are still waiting for the last set of data to load. private int visibleThreshold = 5; // The minimum amount of items to have below your current scroll position before loading more. private int pastVisibleItems, visibleItemCount, totalItemCount; private int current_page = 1; private StaggeredGridLayoutManager mStaggeredGridLayoutManager; public EndlessRecyclerOnScrollListener(StaggeredGridLayoutManager staggeredGridLayoutManager) { this.mStaggeredGridLayoutManager = staggeredGridLayoutManager; } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); visibleItemCount = recyclerView.getChildCount(); totalItemCount = mStaggeredGridLayoutManager.getItemCount(); //firstVisibleItem = mStaggeredGridLayoutManager.findFirstVisibleItemPosition(); int[] firstVisibleItems = null; firstVisibleItems = mStaggeredGridLayoutManager.findFirstVisibleItemPositions(firstVisibleItems); if (firstVisibleItems != null && firstVisibleItems.length > 0) { pastVisibleItems = firstVisibleItems[0]; } if (loading) { if ((visibleItemCount + pastVisibleItems) >= totalItemCount) { loading = false; previousTotal = totalItemCount; } } if (!loading && (totalItemCount - visibleItemCount) <= (pastVisibleItems + visibleThreshold)) { // End has been reached // Do something current_page++; onLoadMore(current_page); loading = true; } if (scrolledDistance > 1 && controlsVisible) { controlsVisible = false; scrolledDistance = 0; } else if (scrolledDistance < -1 && !controlsVisible) { controlsVisible = true; scrolledDistance = 0; } if ((controlsVisible && dy > 0) || (!controlsVisible && dy < 0)) { scrolledDistance += dy; } } public abstract void onLoadMore(int current_page); ; }

Luego, en su actividad o fragmento (este ejemplo es para fragmento) use el siguiente código

RecyclerView mRecyclerView; StaggeredGridLayoutManager mStaggeredGridLayoutManager; private RecyclerView.Adapter adapter; public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle saveInstanceState) { View v = inflater.inflate(R.layout.notices_layout, container, false); mRecyclerView = (RecyclerView) v.findViewById(R.id.listaNoticias); mStaggeredGridLayoutManager = new StaggeredGridLayoutManager( 2, //number of grid columns GridLayoutManager.VERTICAL); //Sets the gap handling strategy for StaggeredGridLayoutManager mStaggeredGridLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE); mRecyclerView.setLayoutManager(mStaggeredGridLayoutManager); //initializing our adapter adapter = new MyAdapter(list, getContext()); //Adding adapter to recyclerview mRecyclerView.setAdapter(adapter); mRecyclerView.setOnScrollListener(new EndlessRecyclerOnScrollListener(mStaggeredGridLayoutManager) { @Override public void onLoadMore(int current_page) { // do something... getData(current_page); } }); return v; }


int mSpanCount = 2; int[] into = new int[mSpanCount]; int firstVisibleItem = staggeredGridLayoutManager.findFirstVisibleItemPositions(into)[0];