0

StaggeredGrid RecyclerView を Endless および SwipeRefreshLayout と組み合わせてみました。しかし、私は自分のコードに問題があります:

grid.addOnScrollListener(new RecyclerView.OnScrollListener() {
           @Override
           public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
               super.onScrolled(recyclerView, dx, dy);
               int visibleItemCount = grid.getChildCount();
               int totalItemCount = mLayoutManager.getItemCount();
               int firstVisibleItem = mLayoutManager.findFirstVisibleItemPositions(null)[0];
               if (firstVisibleItem == 0 && visibleItemCount > 0
                       && grid.getChildAt(0).getTop() >= 0) {
                   mSwipeRefreshLayout.setEnabled(true);
               } else {
                   mSwipeRefreshLayout.setEnabled(false);
               }
               mPreviousVisibleItem = firstVisibleItem;
               if (firstVisibleItem + visibleItemCount == totalItemCount
                       && totalItemCount != 0
                       && isFinishLoadingAwal
                       && !isFinishMoreNews
                       && adapter.getItemCount() > 0) {
                   getMoreNewsFromServer();
               }
           }
       });

上記のコード、問題が発生します:

  1. エンドレス位置で、getMoreNewsFromServer();常に呼び出されます (通常: 1 つ呼び出されます)。

  2. 無限の位置で、mSwipeRefreshLayout が呼び出されます

リストビューを使用した場合、次のように機能します:

list.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
            }
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if (firstVisibleItem == 0 && visibleItemCount > 0
                        && list.getChildAt(0).getTop() >= 0) {
                    mSwipeRefreshLayout.setEnabled(true);
                } else {
                    mSwipeRefreshLayout.setEnabled(false);
                }
                mPreviousVisibleItem = firstVisibleItem;
                if (firstVisibleItem + visibleItemCount == totalItemCount
                        && totalItemCount != 0
                        && isFinishLoadingAwal
                        && !isFinishMoreNews
                        && adapter.getCount() > 0) {
                    getMoreNewsFromServer();
                }
            }
        });

それで、それを修正する方法は?

4

1 に答える 1

-1

初めにすること:

「目が届かないところに手を伸ばす」

onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)

list - >をコードフラグメントのビューに置き換えます。

   && list.getChildAt(0).getTop() >= 0 

2番目:

null でないかどうかを確認せずに mSwipeRefreshLayout を使用するのは危険です。onScroll() {

if (mSwipeRefreshLayout == null) {
   mSwipeRefreshLayout = (SwipeRefreshLayout) view.getRootView().findViewById(R.id...);
} else { .. }

三番:

リフレッシュバグの経験はありませんか?しかし、おそらくあなたのアプリのユーザーはそうするでしょうか?

于 2015-08-13T02:50:15.647 に答える