有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java RecyclerView无休止的滚动

我知道关于同一个问题有很多问题,但我无法找到我的问题。当我在我的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();
}

共 (2) 个答案

  1. # 1 楼答案

    我用这个,它是有效的,也许你必须围绕着价值观玩一点,以适应你的具体情况。不过,我希望它能有所帮助:

    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()方法负责从internet获取数据并通知适配器

  2. # 2 楼答案

    用这个

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