Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用StaggeredLayoutManager实现无止境滚动_Android_Android Recyclerview_Endlessscroll_Staggeredgridlayout - Fatal编程技术网

Android 如何使用StaggeredLayoutManager实现无止境滚动

Android 如何使用StaggeredLayoutManager实现无止境滚动,android,android-recyclerview,endlessscroll,staggeredgridlayout,Android,Android Recyclerview,Endlessscroll,Staggeredgridlayout,我已经尝试为LinearLayoutManager实现无休止的滚动,并且成功地将LinearLayoutManager实现复制到StaggedGridLayoutManager,但没有成功 我只想拿到第一件可以看到的东西 在LinearLayoutManager中: int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition(int); 但实际上,LayoutManager是: int firstVisible

我已经尝试为LinearLayoutManager实现无休止的滚动,并且成功地将LinearLayoutManager实现复制到StaggedGridLayoutManager,但没有成功

我只想拿到第一件可以看到的东西

在LinearLayoutManager中:

int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition(int);
但实际上,LayoutManager是:

int firstVisibleItem = staggeredGridLayoutManager.findFirstVisibleItemPositions(int[])
如何使用(int)而不是(int[])获取第一个VisibleItem

这方面有什么好的方法/实施吗

提前谢谢

我让它工作了:

int mSpanCount = 2;

int[] into = new int[mSpanCount];

int firstVisibleItem = staggeredGridLayoutManager.findFirstVisibleItemPositions(into)[0];
您可以在StaggedGridLayoutManager中使用以下两种方法之一:

  • 传递一个空的int数组,该数组将使用位置进行初始化,并使用对您有意义的数组

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

    要实现EndlessRecyclerOnScrollListener,首先创建EndlessRecyclerOnScrollListener java类

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

    这是我的
    滚动监听器的实现

    下面是我实现ScrollListener的代码:

    private endlesscrollstener滚动监听器滚动监听器=
    新建EndlessScrollListener(新建EndlessScrollListener.RefreshList(){
    @重写公共void onRefresh(int pageNumber){
    //在这里,您可以执行服务器连接或任何其他操作,以更新数据并显示回收器视图
    //注意:这是同步方法
    }
    });
    addOnScrollListener(scrollListener);
    
    自定义
    ScrollListener
    类:

    class EndlessScrollListener扩展了RecyclerView.OnScrollListener{
    私有布尔孤岛加载;
    私人网页;
    私有int pageNumber=0;
    私人刷新列表刷新列表;
    私有布尔是反擦痕;
    私人物品;
    公共EndlessScrollListener(刷新列表刷新列表){
    this.isLoading=false;
    this.hasMorePages=true;
    this.refreshList=刷新列表;
    }
    @覆盖已克隆的公共void(RecyclerView RecyclerView、int dx、int dy){
    super.onScrolled(recyclerView、dx、dy);
    StaggedGridLayoutManager经理=
    (StaggedGridLayoutManager)recyclerView.getLayoutManager();
    int visibleItemCount=manager.getChildCount();
    int totalItemCount=manager.getItemCount();
    int[]firstVisibleItems=manager.findFirstVisibleItemPositions(null);
    if(firstVisibleItems!=null&&firstVisibleItems.length>0){
    pastVisibleItems=firstVisibleItems[0];
    }
    如果((visibleItemCount+pastVisibleItems)>=totalItemCount&&!isLoading){
    isLoading=true;
    如果(hasMorePages&!isRefreshing){
    isRefreshing=真;
    new Handler().postDelayed(new Runnable()){
    @重写公共无效运行(){
    refreshList.onRefresh(页码);
    }
    }, 200);
    }
    }否则{
    isLoading=false;
    }
    }
    公共无效名称页(){
    this.hasMorePages=false;
    }
    公共页{
    isRefreshing=假;
    页码=页码+1;
    }
    公共接口刷新列表{
    void onRefresh(int页码);
    }
    }
    
    非常感谢您提供此解决方案。它工作得很好,我想。实际上,在更新后的AppCompactLibrary中,他们有一些方法可以做到这一点。但由于某些原因,我无法更新库。所以我被卡住了。你的回答给了我适当的解决办法。非常感谢。是否刷新始终为真,此方法必须是公共的,并在“onRefresh”@PabloCegarra中调用。请您再解释一次好吗?我不明白你什么意思?监听器的主要思想是让开发人员知道用户何时触到列表的末尾。因此,他在“onRefresh()”中得到了这个事件。或者我错了吗?是的,它对我来说就像一个符咒,但是这个例子很混乱,因为notifyMorePages不公开它在工作,但是EndlessScrollListener构造函数和RefreshList不公开这就是为什么我面临这个问题,我在Kotlin中使用它,当我滚动它不工作时,它只在初始化时工作一次,你知道吗,我做错了什么。我在哪里通知更多页面。@farhana我已经使用此代码加载下一部分数据(这是很久以前的事了),现在我又在使用一个很好的解决方案
        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;
    }