Положение addOnScrollListener сбрасывается на верх, когда новые данные загружаются после прокрутки - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть вид рециркулятора, и на нем реализован 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 оставалась именно в этой последней позиции.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Делай как это

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
//  Your other code
    ...

    adapter = new JinsiAnurodhTalikaAdapter(posts,getApplicationContext());
    recyclerView.setAdapter(adapter);
}

и в вашем методе dataCall

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

            progressBar.setVisibility(View.GONE);
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onFailure(Call<JinsiAnirodhTalikaModel> call, Throwable t) {
            Log.e("error",t.getMessage());
        }
    });
}
0 голосов
/ 05 сентября 2018

пока вы получаете данные во второй раз, используйте adapter.notifydatasetchanged(); вместо установки адаптера, в вашем случае вы используете adapter.notifydatasetchanged();, а во второй строке вы снова recyclerView.setAdapter(adapter); устанавливаете адаптер на утилите-утилизаторе, их настраивать не нужно Адаптер в представлении утилизатора во второй раз, когда вы загружаете больше элементов в списке, просто не устанавливайте адаптер в списке в секунду, и это должно сработать

...