1

我一直在試圖尋求各種其他問題的幫助,但我似乎無法找到解決方案。使用Parse和RecyclerView分頁

OnScrollListener我使用:https://gist.github.com/ssinss/e06f12ef66c51252563e

rvHome.addOnScrollListener(new MainRecyclerViewScrollListener(linearLayoutManager) { @Override public void onLoadMore(int page) { fetchPosts(page); } });

public void fetchOfflinePosts() { 
    offlineListPosts = db.getAllPosts(); 

    for (Post post : offlineListPosts) { 
     listPosts.add(post); 
    } 

    postAdapter.notifyDataSetChanged(); 
} 

public void loadPosts() { 

    if (ConnectivityHelper.isConnected(getContext())) { 
     db.deleteAllPosts(); 
     listPosts.clear(); 
     fetchPosts(0); 
    } else { 
     swipeRefreshLayout.setRefreshing(false); 
    } 

} 

public void fetchPosts(int skip) { 
    ParseQuery<ParseObject> findPostsRequest = new ParseQuery<>("Post"); 
    findPostsRequest.setSkip(skip); 
    findPostsRequest.orderByDescending("createdAt"); 
    findPostsRequest.findInBackground(new FindCallback<ParseObject>() { 
     @Override 
     public void done(List<ParseObject> posts, ParseException e) { 

      if (e == null) { 
       for (ParseObject _post : posts) { 
        final Post post = new Post(); 

        String objectId = _post.getObjectId(); 
        String username; 
        String imageUrl;      

        if (_post.getString("username") != null) { 
         username = _post.getString("username"); 
        } else { 
         username = ""; 
        } 

        ParseQuery<ParseUser> findProfilePicQuery = ParseUser.getQuery(); 
        findProfilePicQuery.whereEqualTo("username", username); 
        findProfilePicQuery.findInBackground(new FindCallback<ParseUser>() { 
         @Override 
         public void done(List<ParseUser> users, ParseException e) { 

          if (e == null) { 
           for (ParseUser user : users) { 

            if (user.getParseFile("profilePic") != null) { 
             post.setProfilePicUrl(user.getParseFile("profilePic").getUrl()); 
            } else { 
             post.setProfilePicUrl(""); 
            } 

           } 
          } 

         } 
        }); 

        if (_post.getParseFile("photo") != null) { 
         imageUrl = _post.getParseFile("photo").getUrl(); 
        } else { 
         imageUrl = ""; 
        } 

        post.setObjectId(objectId); 
        post.setUsername(username); 
        post.setImageUrl(imageUrl); 

        db.addPost(post); 
       } 

       fetchOfflinePosts(); 
       swipeRefreshLayout.setRefreshing(false); 
      } 

     } 
    }); 
} 

通過使用上面的代碼,我可以得到RecyclerView一旦到達最後一個項目,以裝載更多的物品,但該職位獲取是一樣的那些我已經得到了。我知道我得到了一些非常簡單的錯誤。任何幫助將非常感激。

回答

0

這裏的分頁的工作示例,並刷新數據與解析:

@Override 
    public void onVideosRequested(final int categoryId, final boolean isRefresh, final int page) { 
     if (!isRefresh && page == 0) { 
      mView.showIndicator(); 
     } 
     ParseQuery<ParseVideo> query = ParseVideo.generateGetVideosByCategoryQuery(categoryId, page, CategoryFragment.VIDEOS_PER_PAGE); 
     query.findInBackground(new FindCallback<ParseVideo>() { 
      @Override 
      public void done(List<ParseVideo> objects, ParseException e) { 
       if (!isRefresh) { 
        if (page == 0) { 
         mView.hideIndicator(); 
        } 
       } else { 
        mView.showHideRefreshLayout(false); 
       } 
       if (e == null) { 
        if (objects != null && objects.size() > 0) { 
         List<ParseVideo> mList = cleanData(objects); 
         List<ParseVideo> mVideos = DashboardActivity.mVideos.get(categoryId); 
         if (page == 0) { 
          mVideos.clear(); 
          mVideos.addAll(mList); 
         } else { 
          mVideos.addAll(mList); 
         } 
         if (objects.size() < CategoryFragment.VIDEOS_PER_PAGE) { 
          mView.isLoadMoreAvailable(false); 
         } else { 
          mView.isLoadMoreAvailable(true); 
         } 
         DashboardActivity.mIndexes.put(categoryId, page); 
         mView.onVideosReceived(mList.size(), page); 
        } else { 
         mView.isLoadMoreAvailable(false); 
        } 
       } else { 
        mView.onDefaultError(e.getLocalizedMessage()); 
       } 
      } 
     }); 
    } 


    @Override 
    public List<ParseVideo> cleanData(List<ParseVideo> data) { 
     List<ParseVideo> mList = new ArrayList<>(); 
     for (ParseVideo pv : data) { 
      if (pv != null && !TextUtils.isEmpty(pv.getName()) && !TextUtils.isEmpty(pv.getId())) { 
       mList.add(pv); 
      } 
     } 
     return mList; 
    } 

在UI設置默認變量paginationrefresh

private int currentPage = 0; 
private boolean isLoadMoreAvailable = true; 

,讓您的來電:

mController.onVideosRequested(mId, false, currentPage); 

And onLoadMore

if (isLoadMoreAvailable) { 
    mController.onVideosRequested(mId, false, currentPage + 1); 
} 

onLoadMoreRefresh棘手的部分在一起,當你刷新你的數據,你必須重置scrollListeners總和以前的數保持loadMore仍然可用。

mHidingScrollListener.setPreviousTotal(0); 
mHidingScrollListener.setTotalItemCount(0); 

最後這裏的parse query

public static ParseQuery<ParseVideo> generateGetVideosByCategoryQuery(int categoryId, int page, int displayLimit) { 
     ParseQuery<ParseVideo> query = ParseQuery.getQuery(ParseVideo.class); 
     query.whereEqualTo(ParseConstants.IS_DELETED, false); 
     query.addDescendingOrder(ParseConstants.CREATED_At); 
     if (categoryId != ParseConstants.CATEGORY_ID_HOME) { 
      query.whereEqualTo(CATEGORY_ID, categoryId); 
     } 
     query.setLimit(displayLimit); 
     query.setSkip(page * displayLimit); 
     return query; 
    } 
+0

感謝。我現在就試試看。 –

+0

如果您有關於實施的問題,我們可以討論。 – savepopulation