【问题标题】:RecyclerView Endless ScrollRecyclerView 无尽滚动
【发布时间】:2017-07-01 08:23:48
【问题描述】:

我知道有很多关于同一问题的问题,但我无法找到我的问题。当我在 HttpRequest 类中打印 URL 时,它显示了正确的 URL,但它仍在加载相同的数据。

   recyclerView.addOnScrollListener(new asd(manager    ) {
                boolean loading = false;
                int scrollIndex = 1;
                @Override
                public void onScrolledToEnd() {

                    if(!loading){
                        loading = true;
                        try {
                            scrollIndex = scrollIndex+10;
                            String url = "https // xyz  com?q=" + query + "&scrollIndex="+ scrollIndex + "&key=" + getResources().getString(R.string.api_key);
                            new HttpRequest(url,SearchActivity.this).execute();
                            adapter.notifyItemRangeChanged(list.size(),10);
                            adapter.notifyDataSetChanged();
                        } catch (MalformedURLException e) {
                            e.printStackTrace();
                        }

                    }
                    loading = false;
                }
            });

这里是 OnScrollListener

public abstract class asd extends RecyclerView.OnScrollListener {


    public static String TAG = asd.class.getSimpleName();

    // use your LayoutManager instead
    private LinearLayoutManager llm;

    public asd(LinearLayoutManager sglm) {
        this.llm = sglm;
    }

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

        if (!recyclerView.canScrollVertically(1)) {
            onScrolledToEnd();
        }
    }

    public abstract void onScrolledToEnd();
}

【问题讨论】:

    标签: java android android-recyclerview onscrolllistener


    【解决方案1】:

    使用这个。

    LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
            mRecyclerView.setLayoutManager(mLayoutManager);
            mRecyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(mLayoutManager,maxCount) {
                @Override
                public void onLoadMore(int current_page) {
                    /// onLoadMore(current_page);
                    loadmoreContacts(current_page);
                    Log.e("onLoadMore ", "" + current_page);
                }
            });
    

    新建类

    public abstract class EndlessRecyclerOnScrollListener extends
        RecyclerView.OnScrollListener {
    public static String TAG = EndlessRecyclerOnScrollListener.class
            .getSimpleName();
    int maxCount;
    private int previousTotal = 0;
    private boolean loading = true;
    private int visibleThreshold = 5;
    int firstVisibleItem, visibleItemCount, totalItemCount;
    
    private int current_page = 1;
    
    private LinearLayoutManager mLinearLayoutManager;
    
    public EndlessRecyclerOnScrollListener(
            LinearLayoutManager linearLayoutManager,int maxCount) {
        this.mLinearLayoutManager = linearLayoutManager;
        this.maxCount = maxCount;
    }
    
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
    
        visibleItemCount = recyclerView.getChildCount();
        totalItemCount = mLinearLayoutManager.getItemCount();
        firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();
    
        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false;
                previousTotal = totalItemCount;
            }
        }
    
        if(totalItemCount>=maxCount){
            loading=false;
            return;
        }
        if (!loading  && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
            // End has been reached
    
            // Do something
            current_page++;
    
            onLoadMore(current_page);
    
            loading = true;
        }
    }
    public abstract void onLoadMore(int current_page);}
    

    【讨论】:

      【解决方案2】:

      我使用它并且它正在工作,也许您必须使用一些值来适应您的特定情况。不过我希望它有所帮助:

      mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
          @Override
          public void onScrollStateChanged(RecyclerView recyclerView,
                                           int newState) {
              super.onScrollStateChanged(recyclerView, newState);
          }
      
          @Override
          public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
              super.onScrolled(recyclerView, dx, dy);
              LinearLayoutManager linearLayoutManager = ((LinearLayoutManager)mRecyclerView.getLayoutManager());
              int visibleItemCount = linearLayoutManager.getChildCount();
              int totalItemCount = linearLayoutManager.getItemCount();
              int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
      
              //Log.d(TAG,"Visible="+visibleItemCount+", total="+totalItemCount+", first="+firstVisibleItemPosition);
      
              if ((visibleItemCount + firstVisibleItemPosition) >= totalItemCount
                      && firstVisibleItemPosition >= 0
                      && totalItemCount >= pageSize) {
                  //Log.d(TAG,"Entrato, lancio");
                  loadMoreItems();
              }
          }
      });
      

      这里pageSize是我每次加载的元素数量; loadMoreItems() 方法负责从互联网上获取数据并通知适配器。

      【讨论】:

      • 如何通过api进行分页?我的 loadMoreItems() 实现是否正确?
      • 这取决于你,我不知道你的 api 是如何工作的
      • 它需要 url 中的 startIndex,我从中每 10 个项目分页并将 startIndex 增加 10,问题是您的代码我的 startIndex 仅增加 10 一次,并且添加的项目始终来自以前的 url
      • 您可以尝试只调用adapter.notifyDataSetChanged(); .. 也请务必将您的 HttpRequest 设置在 AsyncTask 或后台线程中
      • 你有变量totalItemCount 告诉你在recyclerView中有多少项目。你可以通过 loadMoreItems 方法传递它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      相关资源
      最近更新 更多