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

How can i prevent recyclerview scrolling to start when i load more data

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

我已经覆盖了 RecyclerviewonScrollListeneronScrolled 方法以加载更多数据。我每次都使用 fetchingJSON() 函数向 Arraylist 添加新数据。然后我调用 setupRecycler() 函数以使用我更新的 Arraylist 设置 Recyclerview

假设我一开始加载了 4 条新闻,然后我滚动到页面底部并加载了另外 4 条新闻。它只是将新数据添加到 Arraylist 并重新创建 recyclerview。我认为这就是为什么在 first.But 安装 8 个新闻没有太大区别我不知道该怎么做才能避免这种情况。

/*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();

                }
            }
        });

然后在 fetchingJSON() 函数中,我调用 parseJSONData 函数来解析响应。 我没有在onResponse中这样做,因为volley的异步操作会导致一些问题

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
                .
                .
                .

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

public void parseJSONData(String response) {

        try {
            JSONObject obj = new JSONObject(response);
            JSONArray dataArray = obj.getJSONArray("data");


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

        } catch (JSONException e) {
            Log.d(""+TAG,e.printStackTrace() );
        }
    }
private void setupRecycler() {
        lManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(lManager);
        rvAdapter = new RvAdapter(this, haberModelArrayList);
        recyclerView.setAdapter(rvAdapter);
        isLoading = false;
    }

如果 rvAdapter 是 non-null,则向其添加项目并调用 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();
        }