Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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 使用ReverseLayout RecyclerView将项目添加到无限滚动RecyclerView_Android_Android Recyclerview_Onscrolllistener - Fatal编程技术网

Android 使用ReverseLayout RecyclerView将项目添加到无限滚动RecyclerView

Android 使用ReverseLayout RecyclerView将项目添加到无限滚动RecyclerView,android,android-recyclerview,onscrolllistener,Android,Android Recyclerview,Onscrolllistener,在普通的recyclerview中,最新的项目都位于顶部,如果将项目添加到recyclerview中,它会向下推现有项目,新项目将占据顶部位置 在reverseLayout recyclerview中,最新的项目都位于底部,如果将项目添加到recyclerview中,它将添加到底部。这种布局对于注释提要之类的东西非常有用,因为您希望最新的注释位于底部 这方面的一个很好的例子是当你评论一个朋友的状态时,比如Facebook的评论提要。您可以看到,所有评论都有在底部发布的时间,从上到下的时间从12小

在普通的recyclerview中,最新的项目都位于顶部,如果将项目添加到recyclerview中,它会向下推现有项目,新项目将占据顶部位置

在reverseLayout recyclerview中,最新的项目都位于底部,如果将项目添加到recyclerview中,它将添加到底部。这种布局对于注释提要之类的东西非常有用,因为您希望最新的注释位于底部

这方面的一个很好的例子是当你评论一个朋友的状态时,比如Facebook的评论提要。您可以看到,所有评论都有在底部发布的时间,从上到下的时间从12小时减少到10小时:

reverseLayout很容易设置,我使用以下代码完成了设置:

mLayoutManager = new LinearLayoutManager(this);
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
然而,我正在努力连接一个反向无止境滚动侦听器。我正在使用前一段时间我的问题中的以下Vilen代码()并对其进行修改,以便onLoadMoreListener只在向上滚动而不是向下滚动时激活自己。您要向上滚动到较旧的注释:

    if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
        final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        //if you add on addOnScrollListener, it will cause the scroll listener to be called twice each time you reset your adapter
        recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            int firstVisibleItem;
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

                final int currentFirstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
                totalItemCount = linearLayoutManager.getItemCount();
                lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();

                if(lastVisibleItem > firstVisibleItem)
                {
                    Log.i("SCROLLING UP","TRUE");
                    if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                        current_page++;
                        if (onLoadMoreListener != null) {
                            onLoadMoreListener.onLoadMore(current_page);
                        }
                        loading = true;
                    }
                }
                lastVisibleItem=firstVisibleItem;
            }
        });
    }
然而,当我向上滚动时,似乎根本没有调用onLoadMoreListener

我还确保我的feed中至少有10条评论,之前加载了5条,当我向上滚动时应该再加载5条

你知道我用这个反向OnLoadMoreListener做了什么错事吗

编辑:

reverseLayout recyclerview实际上与Vilen的原始代码一起工作,我上传了一个github repo来展示这一点:

但是,当onLoadMoreListener激活时仍然存在问题-如果评论列表仅包含3条评论,并且没有更多的评论可添加,我不希望onLoadMoreListener在我最初查看我的评论时激活-当我第一次点击我的应用查看评论时。现在,当我单击查看我的评论时,即使数据集中有3条评论,progressBar仍会显示,并且在2秒钟后消失,我认为这是不必要的(请参阅我在其中演示的github repo)

当只有3条注释时禁用它也不是一个好主意,因为onLoadMoreListener就像swipeToRefresh对象一样。如果用户在查看评论源后有更多评论,他可以向下滑动,onLoadMoreListener将显示这些评论


有没有一种方法可以在feed最初加载时禁用它?

西蒙:我之前提出的解决方案可以在没有任何修改的情况下使用反向布局。我要为反向布局添加的唯一一件事是,当您第一次显示它时,自动滚动到第一项,但这取决于您。 现在回到你们的问题上来。您提到当您滚动时,不会发生任何事情。因此,我猜测您以错误的顺序初始化recylcer视图。一定要这样做

mLayoutManager = new LinearLayoutManager(this);
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);

mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new MyAdapter<>(myDataset, mRecyclerView);
mRecyclerView.setAdapter(mAdapter);
mLayoutManager=新的LinearLayoutManager(此);
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
mRecyclerView.setLayoutManager(mllayoutmanager);
mAdapter=newmyadapter(myDataset,mRecyclerView);
mRecyclerView.setAdapter(mAdapter);
注意首先实例化布局管理器,然后设置它,然后提供适配器。如果是这样,请告诉我。

编辑仅从下面的评论中提出:

忘记我们的
onLoadMoreListener
和所有滚动内容,只需使用标准
RecyclerView
包装在
SwipeToRefreshLayout


我真的不想在结尾使用SwipeToRefreshLayout,因为当你有评论源时,它看起来不好

因此,我所做的是修改onLoadMoreListener方法,以便它能够检测何时首次启动Activity。如果是首次启动,我们不希望显示进度条:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
            if (savedInstanceState == null) {
                                initial = true;
            }
}
然后,我们将使用初始布尔变量来确定活动是否刚刚启动并禁用进度条

    @Override
    public void onLoadMore(int current_page) {
        //add progress item
        if (initial) {
            //we do not add the progress bar when the activity opens initially so
            //we do nothing. We just change the variable to false so going forward, you will add a progress bar each time you refresh
            initial = false;
        } else {
            comments.add(createProgressBar());
            mCommentAdapter.notifyItemInserted(comments.size()-1);
        }

嗨,西蒙,等我有几分钟空闲时间,我会看一看。平均时间确保您没有使用最后一个可见项,而是在当前可见项位置为1或0时触发刷新。我一直在尝试不同的东西,但不幸的是,我仍然无法让它正常工作。我已经增加了一笔赏金来增加这笔交易。嗨,维伦,我实际上把你的初始代码放进了一个新的android项目,它似乎与recyclerview的反向布局一起工作。我想我只是感到困惑,因为我认为数据的顺序会改变,例如,而不是注释。添加(0,注释);,我会添加comments.add(comments.size(),comment);因为名单颠倒了。一切都很混乱。我对您的代码有一个额外的问题,这似乎会在最初加载reverseLayout recyclerview时影响它。你能检查一下我的编辑吗?嗨,西蒙,这里没有注释混淆。添加(0,注释)反向布局意味着只有布局反向而不是数据集反向,它只开始反向渲染。关于你的编辑,我不确定你到底需要什么样的行为。如果有3个项目,你希望它做什么?如果随后有更多项目,您的程序将如何知道?您希望它加载更多还是不加载。什么时候需要加载更多的项目?所以我的意思是,如果要触发onLoadMoreListener的项目数量不足,则在初始加载时不应显示progressBar。在我的github repo中,我们最初只有3个项目,因此我根本不希望看到进度条,因为没有更多的项目要加载。如果随后有更多的项目,那么我希望手动向下拖动recyclerview,这将触发列表
    @Override
    public void onLoadMore(int current_page) {
        //add progress item
        if (initial) {
            //we do not add the progress bar when the activity opens initially so
            //we do nothing. We just change the variable to false so going forward, you will add a progress bar each time you refresh
            initial = false;
        } else {
            comments.add(createProgressBar());
            mCommentAdapter.notifyItemInserted(comments.size()-1);
        }