【问题标题】:How to implement infinite scroll in Gridlayout recylcerview如何在 Grid Layout recyclerview 中实现无限滚动
【发布时间】:2016-02-27 18:41:37
【问题描述】:

我需要有关 onscroll 方法的帮助...所以我尝试了一些我在 stackoverflow 上找到的东西,但其中大多数都适用于线性布局等。如果您能指出我正确的方向会非常有帮助...

我正在使用 instagram api 加载图片。它一次发送 20 张图片,所以当我到达页面底部时需要加载更多图片

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
        //configViews();
//        mLayoutManager = new GridLayoutManager(this, 2);
//        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {


            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);



            }
        });

....
}

【问题讨论】:

    标签: android gridview android-recyclerview


    【解决方案1】:

    在OnScrolled中添加这个。这是基本思想。您可以根据需要修改它

    if(dy > 0){ // only when scrolling up
    
        final int visibleThreshold = 2;
    
        GridLayoutManager layoutManager = (GridLayoutManager)recyclerview.getLayoutManager();
        int lastItem  = layoutManager.findLastCompletelyVisibleItemPosition();
        int currentTotalCount = layoutManager.getItemCount();
    
        if(currentTotalCount <= lastItem + visibleThreshold){
            //show your loading view 
            // load content in background
    
        }
    }
    

    【讨论】:

    • 这似乎工作得很好,它可能作为临时工作,但似乎有点生涩。就像我一到谷底...我真的希望根据代码进行较慢的转换...我在所有网格中填充了全新的数据。
    • 我还有一个问题...我一般是 recyclerview 和 android 的新手,所以我在代码中的哪个点重用或回收我的视图?
    • 另外...还有一件事...我的 oncreate mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); 顶部有这两行代码mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
    • 那么在滚动条内设置另一个布局管理器对我来说是否明智?
    • 正如我所说,您需要根据您的要求进行一些更改。onscroll 中的布局管理器不是一个新对象..它是对先前设置的布局管理器的引用。所以可以使用它在 Onscroll 中。如果这解决了问题,请随时接受解决方案:p
    【解决方案2】:

    无限滚动的逻辑可以在适配器中。像这样:

    • 在适配器中返回 size + 1(用于加载视图)
    • 询问最后一个位置时,返回一个指示加载的视图
    • 运行一个后台任务,该任务将下载下一个元素并更改适配器中的数据

    您也可以在显示最后一个元素之前加载下一个元素。

    【讨论】:

      【解决方案3】:

      Kevin Robatel 说对了。处理无限滚动的更好方法是在适配器中。请参阅此答案Sabeer Mohammed。试试这个:

      在适配器中创建一个这样的接口

        public interface OnLoadMoreListener {
          void onLoadMore();
      }
      

      在要获取数据的 Activity 中实现此接口并覆盖 onLoadMore()。

      @Override
      public void onLoadMore() {
         //fetch data here
      }
      

      在 onBindViewHolder() 中返回适配器。写出这个条件。

      // this checks that the last item in the recyclerView has been reached
      // if so, calls onLoadMore()
      if ((position >= getItemCount() - 1)) {
               loadMoreListener.onLoadMore();
      }
      

      但是这个解决方案有一个问题,那就是因为 recyclerView 已经向下滚动,因此 onBindViewHolder() 中的条件将始终满足,直到手动向上滚动。所以 onLoadMore() 将继续被调用。以前的所有数据也会丢失。

      为了避免将数据保存在适配器的列表中。试试这样的:

      public void setResultList(List<String> resultList) {
          this.resultList.addAll(resultList);
          notifyDataSetChanged();
      }
      

      这里使用 addAll() 将新列表添加到前一个列表中。这不仅会保留以前的数据,还会添加新数据。

      记得在接收到新数据时在活动中调用 setResultList()。像这样的东西:(这里我使用的是加载器)

      @Override
      public void onLoadFinished(Loader<String> loader, String data) {
          if (data != null) {
              someAdapter.setResultList(someModel.getResultsList());
          }
      }
      

      希望这有帮助!

      【讨论】:

        【解决方案4】:
         boolean is_loading = false;
        
            @Override
                protected void onCreate(Bundle savedInstanceState) {
                    setContentView(R.layout.your_layout);
                    super.onCreate(savedInstanceState);
        
             recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                        @Override
                        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                            super.onScrolled(recyclerView, dx, dy);
        
                            final int visibleThreshold = 2;
        
                            GridLayoutManager layoutManager = (GridLayoutManager) recyclerView.getLayoutManager();
                            int lastItem = layoutManager.findLastCompletelyVisibleItemPosition();
                            int currentTotalCount = layoutManager.getItemCount();
        
                            if (currentTotalCount <= lastItem + visibleThreshold && is_loading == false) {
                                is_loading = true;
                                //Put you code here        
                            }
                        }
                    });
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-16
          • 2021-12-05
          • 1970-01-01
          • 1970-01-01
          • 2019-09-23
          • 2016-01-02
          • 2022-06-16
          • 1970-01-01
          相关资源
          最近更新 更多