当我加载更多数据时,如何防止recyclerview滚动开始

时间:2019-05-31 14:36:33

标签: java android android-recyclerview android-volley

我正在尝试使用recyclerview中列出的cardview构建新闻提要。问题是,当我通过滚动加载更多数据时,它会自动滚动到页面顶部。我想知道如何防止这种情况。

我已覆盖onScrolled的{​​{1}}的{​​{1}}方法来加载更多数据。我每次使用Recyclerview函数将新数据添加到Arraylist中。然后,我调用onScrollListener函数以使用更新后的Arraylist设置fetchingJSON()

因此,假设我在开始时加载了4条新闻,然后滚动到页面底部并又加载了4条新闻。它只是将新数据添加到Arraylist中,并重新创建了setupRecycler()。我认为这就是为什么一开始安装8个新闻并没有太大区别的原因,但是我不知道该怎么做才能避免这种情况。

Recyclerview

然后在fetchingJSON()函数中,我正在调用parseJSONData函数来解析响应。 我不在onResponse中这样做,因为凌空的异步操作会引起一些问题

recyclerview

在parseJSONData函数中;我从JSON响应中获取数据,并以此设置对象的属性。比将我的对象添加到Arraylist中。最后,我调用setupRecycler函数以使用更新的数据重新创建我的Recyclerview。

/*Here I am controlling if user has reached to bottom of page, and calling fetchingJSON() function.*/

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                int visibleItemCount = lManager.getChildCount();
                int totalItemCount = lManager.getItemCount();
                int firstVisibleItemPosition = lManager.findFirstVisibleItemPosition();


                if ((visibleItemCount + firstVisibleItemPosition) >= totalItemCount
                        && firstVisibleItemPosition >= 0
                        && totalItemCount >= PAGE_SIZE && !isLoading) {

                    newsFeed.this.postPage++;
                    fetchingJSON();

                }
            }
        });
private void fetchingJSON() {
        isLoading = true;
        String url = getResources().getString(R.string.haberUrl); 
        StringRequest jsonStringRequest = new StringRequest(
                Request.Method.POST, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        parseJSONData(response);
                    }

                },
                new Response.ErrorListener() {
                    @Override
                .
                .
                .

1 个答案:

答案 0 :(得分:1)

如果rvAdapter不为空,则向其中添加项目并调用notifyItemRangeInserted()而不是创建新适配器:

       for (int i = 0; i < dataArray.length(); i++) {

            JSONObject dataobj = dataArray.getJSONObject(i);

            haberModel1.setTitle(dataobj.getString("header"));
            haberModel1.setUrl(dataobj.getString("picture"));
            haberModel1.setId(dataobj.getString("id"));
            haberModelArrayList.add(haberModel1);
            // remove line: setupRecycler();
        }
        // Add these lines
        if (rvAdapter != null){
            int itemCount = rvAdapter.getItemCount();
            // TODO: add method setItems() to your adapter
            rvAdapter.setItems(haberModelArrayList);
            rvAdapter.notifyItemRangeInserted(itemCount, dataArray.length());
        } else {
            setupRecycler();
        }