Мне нужна помощь с методом onscroll ... Итак, я попробовал несколько вещей, которые нашел в stackoverflow, но большинство из них работают для linearlayout и т. Д. Было бы очень полезно, если бы вы могли указать мне в правильном направлении ...

Я использую API Instagram для загрузки изображений. он отправляет 20 изображений за раз, поэтому мне нужно загрузить больше, когда я доберусь до конца страницы

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

        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
        //configViews();
//        mLayoutManager = new GridLayoutManager(this, 2);
//        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {


            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);



            }
        });

....
}
5
Hasan Nagaria 27 Фев 2016 в 21:41

4 ответа

Лучший ответ

Добавьте это в OnScrolled. Это основная идея. Вы можете изменить ее в соответствии с вашими требованиями.

if(dy > 0){ // only when scrolling up

    final int visibleThreshold = 2;

    GridLayoutManager layoutManager = (GridLayoutManager)recyclerview.getLayoutManager();
    int lastItem  = layoutManager.findLastCompletelyVisibleItemPosition();
    int currentTotalCount = layoutManager.getItemCount();

    if(currentTotalCount <= lastItem + visibleThreshold){
        //show your loading view 
        // load content in background

    }
}
8
Ravi Teja 27 Фев 2016 в 19:43

Логика бесконечной прокрутки может быть в адаптере. Как это:

  • Размер возврата + 1 в вашем адаптере (для просмотра загрузки)
  • Когда запрашивается последняя позиция, верните представление, указывающее на загрузку
  • Запустите фоновую задачу, которая загрузит следующие элементы и изменит данные в адаптере.

Вы также можете загрузить следующие элементы до того, как будет показан последний элемент.

0
Kevin Robatel 27 Фев 2016 в 19:01

Кевин Робатель понял все правильно. Лучший способ справиться с бесконечной прокруткой - в адаптере. См. Этот ответ Sabeer Mohammed. Попробуйте это:

В адаптере создайте интерфейс как таковой

  public interface OnLoadMoreListener {
    void onLoadMore();
}

Реализуйте этот интерфейс в действии, в котором выполняется выборка данных, и переопределите onLoadMore ().

@Override
public void onLoadMore() {
   //fetch data here
}

Вернитесь в адаптер в onBindViewHolder (). Напишите это условие.

// this checks that the last item in the recyclerView has been reached
// if so, calls onLoadMore()
if ((position >= getItemCount() - 1)) {
         loadMoreListener.onLoadMore();
}

Но у этого решения есть проблема, потому что recyclerView был прокручен вниз, поэтому условие в onBindViewHolder () всегда будет выполняться, пока не будет прокручено вручную. Таким образом, onLoadMore () будет продолжать вызываться. Также все предыдущие данные будут потеряны.

Чтобы избежать этого, храните ваши данные в списке в адаптере. Попробуйте что-то вроде этого:

public void setResultList(List<String> resultList) {
    this.resultList.addAll(resultList);
    notifyDataSetChanged();
}

Не забудьте вызвать getResultList () в действии при получении новых данных. Примерно так: (Здесь я использую загрузчик)

@Override
public void onLoadFinished(Loader<String> loader, String data) {
    if (data != null) {
        someAdapter.setResultList(someModel.getResultsList());
    }
}

Надеюсь, это помогло!

0
will 23 Янв 2018 в 08:21
 boolean is_loading = false;

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            setContentView(R.layout.your_layout);
            super.onCreate(savedInstanceState);

     recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);

                    final int visibleThreshold = 2;

                    GridLayoutManager layoutManager = (GridLayoutManager) recyclerView.getLayoutManager();
                    int lastItem = layoutManager.findLastCompletelyVisibleItemPosition();
                    int currentTotalCount = layoutManager.getItemCount();

                    if (currentTotalCount <= lastItem + visibleThreshold && is_loading == false) {
                        is_loading = true;
                        //Put you code here        
                    }
                }
            });
}
0
Faxriddin Abdullayev 6 Апр 2018 в 09:32