首页 > 解决方案 > 滚动后加载新数据时 addOnScrollListener 的位置重置为顶部

问题描述

我有一个回收器视图,并在其上实现了 addOnScrollListener。以下是我的 api http://uat.nirc.com.np:8080/GWP/inventory/getInventoryRequestOnMobile?memberId=2&offset=0

在我的 api 中,每个值包含最多 10 个项目的偏移量。以下是我实现 addOnScrollListener 的主要课程。

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() 
    {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) 
       {
            super.onScrollStateChanged(recyclerView, newState);
            if(newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL)
            {
                isScrolling = true;
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            currentItems = layoutManager.getChildCount();
            totalItems = layoutManager.getItemCount();
            scrollOutItems = layoutManager.findFirstVisibleItemPosition();

            if(isScrolling && (currentItems + scrollOutItems == totalItems ))
            {
                isScrolling = false;
                getData();
            }

        }
    });

下面是getData函数。

 public void getData()
   {
    if(token <= reqCount){
        progressBar.setVisibility(View.VISIBLE);
        token = token + 9;
        datacall(token);
    }
}

以下是数据调用功能。

public void datacall(int token){
    apiInterface = ApiClient.getApiClient().create(TalikaApiInterface.class);
    Call<JinsiAnirodhTalikaModel> call = apiInterface.getData(id,token);
    call.enqueue(new Callback<JinsiAnirodhTalikaModel>() {
        @Override
        public void onResponse(Call<JinsiAnirodhTalikaModel> call, Response<JinsiAnirodhTalikaModel> response) {
            requestCount = Integer.parseInt(response.body().requestCount);
            for(Data a :response.body().data){
                posts.add(a);
            }
            adapter = new JinsiAnurodhTalikaAdapter(posts,getApplicationContext());
             progressBar.setVisibility(View.GONE);
            adapter.notifyDataSetChanged();
            recyclerView.setAdapter(adapter);
        }

        @Override
        public void onFailure(Call<JinsiAnirodhTalikaModel> call, Throwable t) {
            Log.e("error",t.getMessage());
        }
    });
}

每个令牌中有 10 个项目。滚动到底部后,新数据被加载并且令牌增加了 +9。但是在获取新数据时,scrollListener 的位置重置为顶部,即随着底部获取新数据,recyclerView 重置为顶部。

有人能帮帮我吗?我希望 scrollListener 的位置保持在最后一个位置。

标签: androidapiandroid-recyclerviewretrofitinfinite-scroll

解决方案


当您在第二次使用adapter.notifydatasetchanged();而不是在您使用的情况下设置适配器时获取数据时,adapter.notifydatasetchanged();并且在第二行您再次recyclerView.setAdapter(adapter);在 recyclerview 上设置适配器时,他们不需要在第二次在 recycler 视图上设置适配器是在列表中加载更多项目只是不要在第二个列表上设置适配器,这应该可以解决问题


推荐阅读